一、字符串,数组
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;
}
}