波波老师,leetcode 290题的一个疑惑

来源:4-3 set和map不同底层实现的区别

v不离不弃v

2020-02-26

波波老师您好,290我总结一点就是利用map进行一一对应关系,我的方法是分别构建2个hashmap然后分别验证一一对应,但是我在测试的时候发现,在输入一个cat之后,明明这个string就等于map里存着的string,但是它依然判断为false?老师您可以帮我看看为啥么?
我的代码:

import java.util.HashMap;

/**using hashtable
 * time complexity:
 * space complexity:
 * */
public class Solution {
	public boolean wordPattern(String pattern, String str) {
		
		String[] words=str.split(" ");
		if(pattern.length()!=words.length)
			return false;
		HashMap<Character,String> map = new HashMap<>();
		for(int i=0;i<pattern.length();i++) {
			if(map.containsKey(pattern.charAt(i))) {
				if(map.get(pattern.charAt(i))!=words[i])
					return false;
			}
			else
				map.put(pattern.charAt(i), words[i]);
		}
		
		HashMap<String,Character> map1 = new HashMap<>();
		for(int i=0;i<words.length;i++) {
			if(map1.containsKey(words[i])) {
				if(map1.get(words[i])!=pattern.charAt(i))
					return false;
			}
			else
				map1.put(words[i], pattern.charAt(i));
		}
		return true;
	}
	public static void main(String[] args) {
		String pattern="abba";
		String str="dog cat cat dog";
		System.out.print(new Solution().wordPattern(pattern, str));
	}
}
写回答

2回答

liuyubobobo

2020-02-26

在这个测试用例下,你的程序输出就是错误的:

"aa"
"dog dog"


自己单步跟踪调试一下,看看每一步程序的运行,程序中的变量都存储了什么?变化了什么?变量的变化是不是和你预想的逻辑一致?如果不一致,自己的代码那里有错误,导致没有表达出自己脑子里的逻辑?


在真正写程序的时候,即使最优秀的程序员,也会写出带 bug 的程序,实际上,一个真正的软件开发者,工作时调试用的时间,甚至比开发的时间还要长。能够定位程序中的错误,并且改正程序中的错误,甚至是一个软件工程师的核心竞争力,也是在笔试面试中考核的一个关键。


在笔试面试中,你也可能也会写出错误的代码,届时,你只能靠自己的调试,找到这个错误,并且改正。


更关键的是,在自己写程序的时候,通常进步就发生在这个过程中。


怎么调试?最基本的一点,是使用更小的测试用例,比如我提供给了你一个比你提供的测试用例更小的测试用例,方便你定位出程序中的问题。


其次,就是使用 IDE 中的单步跟踪,或者在逻辑的关键点打印信息的方式,验证程序的每一步执行,结果都和你预期的一致,如果发现不一致,进一步寻找错误的根据。


关于 debug 的重要性,也可以参考我的这篇文章的第 7 条:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247483836&idx=1&sn=90854aa76507281403e4dd9cd434a12b&chksm=fd8caefacafb27ec78f999fde4f1217c04c6e2ff28cf51fe511d8fa29d484d9281ff91de8c9c&token=1074384736&lang=zh_CN#rd


继续加油!:)

0
3
liuyubobobo
回复
v不离不弃v
所有的基本数据类型都可以用 ==,基本数据类型包括:char, boolean, byte, short, int, long, float, double。其他所有情况都应该用 equals。
2020-02-26
共3条回复

v不离不弃v

提问者

2020-02-26

//img.mukewang.com/szimg/5e556cc508c8284616000971.jpg

debug中,设置了判断是否contains的布尔变量k,记录了在map中的值sm以及读入的s[]中的值s1,结果明明记录是相等(x显示均为dog)但是输出就是false。就是说,数值的读入肯定没问题,那么就是在!=和=这个判断有问题了。仔细想了一想,bobo老师说过java中相等,还有个equals,结果改了之后就AC了~~~

0
1
liuyubobobo
赞!继续加油!:)
2020-02-26
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程