面试编程题4:判断两者是否相等

      面试编程第四题,如何判断两者是否相等。这个比较范围就大了,一般有比较两个字符串是否相等,比较两个数组是否相等,两个链表是否相等,两个tress是否相等这样的问题,我们通过代码来一一实现。

1.两个字符串是否相等

这里有一个考察点,判断字符串相等是两个等号(==)还是用equals?

package test;

public class EqualsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String A = "ABba";
		String B = "ABbaa";
		
		if(A.equals(B)){
			System.out.println("相等");
		}else
			System.out.println("不相等");
		
	}

}
       在Java字符串比较相等中,应该使用equals()方法,而不是==,原因是这样的,equal()方法比较的两个对象的值是否相等,而==比较的两个对象的内存地址是否相等。所以,使用==来判断两者是否相等是有缺陷的,下面代码来证明内存地址不同,但是值相同的比较。

package test;

public class EqualsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String A = new String("Hello");
		String B = "Hello";
		
		if(A==B){
			System.out.println("相等");
		}else
			System.out.println("不相等");
		
	}

}

       输出结果是:不相等,因为字符串A使用了new这个关键字,相当于新开了一个内存地址。但是如何你定义A是这样写 Sting A ="Hello",那么这个时候使用==是可以输出两者相等,因为你在声明了两个变量,但是两个都是指向存储“Hello”这个值得地址,两个变量内存地址是一样的,都是指向同一个值。

2. 两个数组是否相等

判断两个数组是否相等,最简单就是使用Arrays.equals(object1, obect2)这个方法。

package test;

import java.util.Arrays;

public class EqualsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String[] A = {"1", "2", "3", "4"};
		String[] B = {"1", "2", "3", "4"};
		
		if(Arrays.equals(A, B)){
			System.out.println("相等");
		}else
			System.out.println("不相等");
		
	}

}

上面的输出结果当然是“相等”。如果不用JAVA API方法,那么可以试试遍历两个数组元素实现。

package test;

import java.util.Arrays;

public class EqualsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String[] A = {"1", "2", "3", "4"};
		String[] B = {"1", "2", "3", "4"};
		
		if(A.length==B.length){
			
			for(int i=0; i<A.length; i++){
				
				if(A[i].equals(B[i])){
					//System.out.println("相等");
				}else{
					System.out.println("不相等");
				}
			}
			//全部元素都相等,才打印相等
			System.out.println("相等");
		}else{
			System.out.println("长度不相等,不需要判断。");
		}
		
	}

}

了解一下,这个普通人想得到的原始方法。

3. 两个list是否相等

同样的,我们先来看看自带的containsAll(obj)方法,然后看看比较暴力的笨方法。

package test;

import java.util.Arrays;
import java.util.List;

public class EqualsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<String> A = Arrays.asList("Tom","Anthony","Beijing");
		List<String> B = Arrays.asList("Tom","Anthony","Beijing");
		
		if(A.containsAll(B)){
			System.out.println("相同");
		}else
			System.out.println("不相同");
		
	}

}

看看循环遍历比较的暴力方法实现,和上面数组比较是一模一样的,

package test;

import java.util.Arrays;
import java.util.List;

public class EqualsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<String> A = Arrays.asList("Tom","Anthony","Beijing");
		List<String> B = Arrays.asList("Tom","Anthony","Beijing");
		
		if(A.size() == B.size()){
			
			for(int i=0; i<A.size(); i++){
				
				if(A.get(i).equals(B.get(i))){
					//do nothing
				}else{
					System.out.println("不想同");
				}
			}
			System.out.println("相等");
			
		}else{
			System.out.println("长度不相等,没有比较的必要");
		}
		
	}

}

4. 比较两个tree是否相同

       由于是树的数据结构比较,这里就比较两个二叉树是否相同。什么是二叉树,就是一个节点下有两个节点,一个左节点,一个右节点。一次往下走,每个节点下又分两个左右节点,当然不是所有节点下都有子节点。所有,判断两个二叉树是否相等,第一个判断父节点是否相同,然后判断这个父节点下的左右两个子节点是否相等,然后遍历所有子节点,满足都相等,才可以说两个二叉树是相等。(以下代码网上照过来比较复杂,一时半会看不明白,脑壳痛)

package test;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class EqualsTest {
 
	private static int[] a1 = { 1, 2, 3, 4, 5, 6 };   
	private static int[] a2 = { 1, 2, 5, 6, 7, 5, 6 };  
	  
	// 定义树节点
	private static class TreeNode {  
	    int val;  
	    TreeNode left;  
	    TreeNode right;  
	  
	    TreeNode(int val) {  
	        this.val = val;  
	        this.left = null;  
	        this.right = null;  
	    }  
	}  
	  
	public static TreeNode createTree(int a[]) {  
	    int len = a.length;  
	    // 将数组的值依次转为Node节点  
	    LinkedList<TreeNode> list = new LinkedList<TreeNode>();  
	    for (int i = 0; i < len; i++){  
	        list.add(new TreeNode(a[i]));  
	    }     
	    for (int i = 0; i < len / 2 - 1; i++) {  
	        list.get(i).left = list.get(i * 2 + 1);  
	        list.get(i).right = list.get(i * 2 + 2);  
	    }  
	    // 最后一个父节点可能没有右边孩子  
	    int last = len / 2 - 1;  
	    list.get(last).left = list.get(last * 2 + 1);  
	    if (len % 2 == 1) {  
	        list.get(last).right = list.get(last * 2 + 2);  
	    }  
	    return list.get(0);  
	} 
	    
	//递归前序遍历输出二叉树  
	public static void preOder(TreeNode head){  
	    System.out.print(head.val+" ");  
	    if(head.left!=null) preOder(head.left);  
	    if(head.right!=null) preOder(head.right);  
	}  
	      
	//递归判断两个二叉树是否相同  
	public static boolean isSameTree(TreeNode head1, TreeNode head2) {  
	    if ((head1 == null && head2 != null) || (head1 != null)  
	            && (head2 == null) || (head1.val != head2.val))  
	        return false;  
	    if (head1.left == null && head1.right == null && head2.left == null  
	            && head2.right == null && head1.val == head2.val)  
	        return true;  
	    return isSameTree(head1.left, head2.left)  
	            && isSameTree(head1.right, head2.right);  
	} 
	
	public static void main(String[] args){
		TreeNode head1 = createTree(a1);  
        System.out.println("Tree1:");  
        preOder(head1);  
        System.out.println();  
          
        TreeNode head2 = createTree(a2);  
        System.out.println("Tree2:");  
        preOder(head2);  
        System.out.println();  
        
        System.out.println("Tree1和Tree2相同吗?" + isSameTree(head1, head2)); 
	}
}



测试结果:

Tree1:
1 2 4 5 3 6 
Tree2:
1 2 6 7 5 5 6 
Tree1和Tree2相同吗?false

总结:

       主要是要明白==和equals方法的区别,还有一定要记得上面数组和list的暴力比较方法,虽然很笨,但是如果你记不住JAVA API对应方法,你可以拿这个暴力方法来写代码,只是给面试官证明你有思路,还找出了解决办法,然后再提一下,你好像记得有一个更简单的内建方法,只是名称不记得了。二叉树的比较,这个比较变态,一时半会只要了解比较原理就好,这么长代码,除非你能背下来,刚刚面试人家问到了,那么你就中奖了,否则没有任何意义。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值