程序员面试金典(java版)

来源:互联网 发布:虚拟手机号注册软件 编辑:程序博客网 时间:2024/05/05 18:39

一、字符串,数组

1.1 确定字符互异

分析:采用了最基本的方法,可以改进的思路。
代码如下:
public class Different {    public boolean checkDifferent(String iniString) {        boolean flag = true;        int len = iniString.length();        for(int i=0;i<len;i++){        char c = iniString.charAt(i);        for(int j=0;j<i;j++){        if(iniString.charAt(j)==c){        flag = false;        break;        }        }        if(flag==false){        break;        }        }        return flag;    }}

1.3 确定两串乱序同构

题目描述

给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。

给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。


分析:
代码如下:

二、链表

2.3 访问单个节点删除

原题:实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true

分析:因为只能访问改节点,没法找到前一个节点进行删除,参照了别人的一个很巧妙的思路,就是把该节点变成他的后继节点,然后指向再下一个几点,也就变成删除了他的后继节点。

代码如下:

public class Remove {    public boolean removeNode(ListNode pNode) {        if(pNode.next == null){ return false;}        else{        pNode.val = pNode.next.val;        pNode.next = pNode.next.next;        return true;        }    }}


2.4 链表分割

题目描述

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。


分析:数据保持原来的顺序,这样一来就可以设置两个链表,在遍历链表的过程中,一个保存小于x的链表,一个保存大于x的链表,最后把两个链表链接起来。有些细节需要注意的是,最终第二个链表的最后一个节点要单独设置使其指向空指针。另外返回的头结点需要指向设置的头结点的下一个节点。
代码如下:
public class Partition {    public ListNode partition(ListNode pHead, int x) {        ListNode head1 = new ListNode(0);ListNode head2 = new ListNode(0);ListNode newHead1 = head1;ListNode newHead2 = head2;        while(pHead != null){        if(pHead.val<x){        head1.next = pHead;        head1 = head1.next;        }        else{        head2.next = pHead;        head2 = head2.next;        }        pHead = pHead.next;        }        head2.next = null;        head1.next = newHead2.next;        return newHead1.next;    }}

2.7 回文链表

题目描述

请编写一个函数,检查链表是否为回文。

给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。

测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false

分析:考虑先用快慢指针找到链表的中点,然后将后半部分链表压入栈中,在依次弹出与前半部分的链表节点比较。

代码如下:
public class Palindrome {    public boolean isPalindrome(ListNode pHead) {        if(pHead==null || pHead.next==null) return true;Stack<ListNode> stack = new Stack<ListNode>();boolean flag = true;ListNode slow = pHead;ListNode fast = pHead;while(fast!=null && fast.next!=null){slow = slow.next;fast = fast.next.next;if(slow==fast){break;}}fast = slow;while(slow!=null){stack.push(slow);slow = slow.next;}while(!stack.isEmpty()){if(stack.pop().val!=pHead.val){flag = false;break;}else{pHead = pHead.next;}}        return flag;    }}



0 0
原创粉丝点击