程序员面试金典(java版)

一、字符串,数组

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;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值