程序员面试金典(java版)
2017-02-02 19:58
239 查看
一、字符串,数组
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; } }
相关文章推荐
- 程序员面试金典(java版)
- 程序员面试金典(动态规划):返回某集合的所有子集(java解法)
- 程序员面试金典(动态规划):8(n)皇后问题(java解法)
- 程序员面试金典: 9.14 Java 14.2在Java中,若在try-catch-finally的try语句块中插入return语句,finally语句块是否还会执行?
- 程序员面试金典——解题总结: 9.14Java 14.6实现CircularAray类,支持类似数组的数据结构,这些数据结构可以高效地进行旋转
- 程序员面试金典——解题总结: 9.14 Java 14.3final,finally和finalize之间有什么差异?----
- 程序员面试金典(动态规划):约瑟夫环问题(java解法)
- 程序员面试金典(排序与查找):元素查找(java解法)
- 程序员面试金典: 9.14 Java 14.1 从继承的角度来看,将构造函数声明为私有会有何作用?
- 程序员面试金典(排序与查找):变位词排序(java解法)
- 程序员面试金典——解题总结: 9.14 Java 14.5Java中的对象反射是什么?它有什么用?
- java 程序员面试金典 4.1
- 程序员面试金典(动态规划):叠罗汉问题_最长递增子序列(java解法)
- 程序员面试金典(java版)
- 程序员面试金典——解题总结: 9.14 Java 14.4C++模板和Java泛型之间有何不同?
- JAVA真的输了吗?
- HTML、Swing还是XML,Java客户端工具选择?(三)
- sun 称 java 存在漏洞!
- 实 现JAVA 的 动 态 类 载 入 机 制
- 从C++到Java --理解面向对象是关键所在