程序员面试金典适合java么,程序员面试金典(java版)

这篇博客主要探讨了字符串的字符互异性判断,如何确定两个字符串是否可以通过字符重新排列达到相同,以及链表节点的删除和分割操作。对于字符串,提出了基本的判断方法;对于链表,介绍了如何在只访问节点的情况下删除它,以及如何根据给定值分割链表保持顺序不变。此外,还讨论了如何检查链表是否为回文链表的解决方案。
摘要由CSDN通过智能技术生成

一、字符串,数组

1.1 确定字符互异

分析:采用了最基本的方法,可以改进的思路。

代码如下:

public class Different {

public boolean checkDifferent(String iniString) {

boolean flag = true;

int len = iniString.length();

for(int i=0;i

char c = iniString.charAt(i);

for(int j=0;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

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 stack = new Stack();

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值