程序员面试金典(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
- 程序员面试金典(java版)
- 程序员面试金典(java版)
- 程序员面试金典(java版)
- JAVA程序员面试宝典 (2011版)
- 《程序员面试金典》
- 程序员面试金典:
- 程序员面试金典:
- 程序员面试金典:
- 程序员面试金典:
- 程序员面试金典
- 程序员面试金典
- 清除行列(程序员面试金典)
- 程序员面试金典(一)
- 程序员面试金典(二)
- [JAVA程序员面试金典]最长递增子序列
- JAVA程序员面试精典问题(一)
- 《Java程序员面试宝典(第4版)》 试读感想
- 程序员面试金典(动态规划):8(n)皇后问题(java解法)
- (转)算法帝国:华尔街交易怪兽的核武器缔造史
- List、Set、Map常见集合遍历总结
- hdoj 2019
- c++碎片
- HDU1998 奇数阶魔方
- 程序员面试金典(java版)
- 《深入理解java虚拟机》-晚期(运行期)优化
- HDU2000 ASCII码排序
- 3D游戏引擎系列七
- 虚拟机ping不通主机,但是主机可以ping通虚拟机
- 12.2.1
- C语言不用scanf函数的一个简单的计算器
- HDU2001 计算两点间的距离
- Node.js实现301、302重定向服务