2022.3.10 数字和字符串拼接 + equals() 和 == 的区别


一、今日刷题

1. 第七部分:二叉树 – 652. 寻找重复的子树

跳转LeetCode

给定一棵二叉树 root,返回所有重复的子树。
对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

在这里插入图片描述
示例1输出中的4表示单个的叶子节点值的重复也算子树重复。


答案代码

package BinaryTree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author: LYZ
 * @date: 2022/3/10 18:28
 * @description: 652. 寻找重复的子树
 */
public class FindDuplicateSubtrees {
    public static void main(String[] args) {

    }

    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        traverse(root);
        return list;
    }

    HashMap<String, Integer> map = new HashMap<>();
    List<TreeNode> list = new ArrayList<>();

    public String traverse(TreeNode root) {
        if (root == null) {
            return "#";
        }
		
		//将左右子树序列化成字符串
        String left = traverse(root.left);
        String right = traverse(root.right);

        String s = left + "," + right + "," + root.val;//用来描述以该节点为根的二叉树

        int frequency = map.getOrDefault(s, 0);
        if (frequency == 1) {
            list.add(root);
        }
        map.put(s, frequency + 1);
        return s;
    }
}

总结

1.本题可以用来练习判断我们应该用前序还是中序还是后序遍历的框架。

根据题意,思考一个二叉树节点需要做什么,到底用什么遍历顺序就清楚了。

想知道以自己为根的子树是不是重复的,是否应该被加入结果列表中,

需要知道以下两点:

1、以我为根的这棵二叉树(子树)长啥样?

2、以其他节点为根的子树都长啥样?


2.Java 中数字和字符串拼接的问题:

String s = left + "," + right + "," + root.val;

root.val 本身是整型变量,但在字符串拼接时可以拼入字符串中:

1、数字拼接char,得到的还是数字,相当于和它的ASCII编码相加(如果定义成String 会编译错误)
2、数字拼接String,得到的是String
3、数字同时拼接char 和 String,就看和谁先拼接,和谁后拼接
4、String 拼接任何类型,得到的都是String

public static void main(String[] args) {
		char c1 = 1 + 'a'; //这样其实属于"强制声明" 1 + 'a'的结果类型了,默认情况下,1 + 'a'的结果是98
		System.out.println(c1);
		System.out.println("*********************");
		//1、数字拼接char,得到的还是数字,相当于和它的ASCII编码相加
		int n1 = 1 + 'a';
		System.out.println(n1);
		System.out.println("*********************");
		//2、数字拼接String,得到的是String
		String s1 = 1 + "abc";
		System.out.println(s1);
		System.out.println("*********************");

		//int n2 = 1 + "abc";  报错
		String s2 = "1" + "abc";
		System.out.println(s2);
		System.out.println("*********************");
		//System.out.println(s1.equals(s2));
		//3、数字同时拼接char 和 String,就看和谁先拼接,和谁后拼接
		String s3 = 1 + 'a' + "abc";
		System.out.println(s3);
		System.out.println("*********************");

		String s4 = 1 + "abc" + 'a';
		System.out.println(s4);
		System.out.println("*********************");

		String s5 = 'a' + 1 + "abc";
		System.out.println(s5);
	}

输出结果为:

b
*********************
98
*********************
1abc
*********************
1abc
*********************
98abc
*********************
1abca
*********************
98abc

3.Java中equals()和==的区别

equals 是比较内存地址上面的值是否相同
== 是比较内存地址是否相同

******而且,equals 是针对引用数据类型的方法,取出内存地址中的值比较是否相同, 基本数据类型无equals方法

public static void main(String[] args) {
		Integer aaa=new Integer(5);
		Integer bbb=new Integer(5);

		int a=10;
		int b=10;
		String str1=new String("justice");
		String str2=new String("justice");
		String str3;
		str3=str1;
		
		System.out.println(aaa==bbb);
		System.out.println(aaa.equals(bbb));
		System.out.println(a==b);
		System.out.println("********************");
		
		System.out.println(str1==str2);
		System.out.println(str1.equals(str2));
		System.out.println("********************");
		
		System.out.println(str1==str3);
		System.out.println(str1.equals(str3));
	}

执行结果:

false
true
true
********************
false
true
********************
true
true

若为

Integer a = 5;
Integer b = 5; 

则 a == b 的输出为 true, 因为定义一个Integer变量时,会默认进行Integer.valueOf(a)操作,查源码得当声明的包装类整型变量值在-128 - 127之间(整数缓冲区)时,其地址是相同的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值