从小白开始刷算法 Hash 哈希篇 leetcode.389

简介: 从小白开始刷算法 Hash 哈希篇 leetcode.389

389. 找不同


给定两个字符串 s 和 t ,它们只包含小写字母。


字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。


请找出在 t 中被添加的字母。


示例 1:


输入:s = “abcd”, t = “abcde”

输出:“e”

解释:‘e’ 是那个被添加的字母。

示例 2:


输入:s = “”, t = “y”

输出:“y”


题目来源:力扣(LeetCode)


哈希表解决思路


能否写出:能写出来

时间:20分钟

思路:

第一版,把s数组循环放在map上,再循环t数组,如果存在,就将对应的字符从HashMap中移除,最后剩下的字符即为多出的字符,但解答失败。


解答失败:

测试用例:

“ymbgaraibkfmvocpizdydugvalagaivdbfsfbepeyccqfepzvtpyxtbadkhmwmoswrcxnargtlswqemafandgkmydtimuzvjwxvlfwlhvkrgcsithaqlcvrihrwqkpjdhgfgreqoxzfvhjzojhghfwbvpfzectwwhexthbsndovxejsntmjihchaotbgcysfdaojkjldprwyrnischrgmtvjcorypvopfmegizfkvudubnejzfqffvgdoxohuinkyygbdzmshvyqyhsozwvlhevfepdvafgkqpkmcsikfyxczcovrmwqxxbnhfzcjjcpgzjjfateajnnvlbwhyppdleahgaypxidkpwmfqwqyofwdqgxhjaxvyrzupfwesmxbjszolgwqvfiozofncbohduqgiswuiyddmwlwubetyaummenkdfptjczxemryuotrrymrfdxtrebpbjtpnuhsbnovhectpjhfhahbqrfbyxggobsweefcwxpqsspyssrmdhuelkkvyjxswjwofngpwfxvknkjviiavorwyfzlnktmfwxkvwkrwdcxjfzikdyswsuxegmhtnxjraqrdchaauazfhtklxsksbhwgjphgbasfnlwqwukprgvihntsyymdrfovaszjywuqygpvjtvlsvvqbvzsmgweiayhlubnbsitvfxawhfmfiatxvqrcwjshvovxknnxnyyfexqycrlyksderlqarqhkxyaqwlwoqcribumrqjtelhwdvaiysgjlvksrfvjlcaiwrirtkkxbwgicyhvakxgdjwnwmubkiazdjkfmotglclqndqjxethoutvjchjbkoasnnfbgrnycucfpeovruguzumgmgddqwjgdvaujhyqsqtoexmnfuluaqbxoofvotvfoiexbnprrxptchmlctzgqtkivsilwgwgvpidpvasurraqfkcmxhdapjrlrnkbklwkrvoaziznlpor”
“qhxepbshlrhoecdaodgpousbzfcqjxulatciapuftffahhlmxbufgjuxstfjvljybfxnenlacmjqoymvamphpxnolwijwcecgwbcjhgdybfffwoygikvoecdggplfohemfypxfsvdrseyhmvkoovxhdvoavsqqbrsqrkqhbtmgwaurgisloqjixfwfvwtszcxwktkwesaxsmhsvlitegrlzkvfqoiiwxbzskzoewbkxtphapavbyvhzvgrrfriddnsrftfowhdanvhjvurhljmpxvpddxmzfgwwpkjrfgqptrmumoemhfpojnxzwlrxkcafvbhlwrapubhveattfifsmiounhqusvhywnxhwrgamgnesxmzliyzisqrwvkiyderyotxhwspqrrkeczjysfujvovsfcfouykcqyjoobfdgnlswfzjmyucaxuaslzwfnetekymrwbvponiaojdqnbmboldvvitamntwnyaeppjaohwkrisrlrgwcjqqgxeqerjrbapfzurcwxhcwzugcgnirkkrxdthtbmdqgvqxilllrsbwjhwqszrjtzyetwubdrlyakzxcveufvhqugyawvkivwonvmrgnchkzdysngqdibhkyboyftxcvvjoggecjsajbuqkjjxfvynrjsnvtfvgpgveycxidhhfauvjovmnbqgoxsafknluyimkczykwdgvqwlvvgdmufxdypwnajkncoynqticfetcdafvtqszuwfmrdggifokwmkgzuxnhncmnsstffqpqbplypapctctfhqpihavligbrutxmmygiyaklqtakdidvnvrjfteazeqmbgklrgrorudayokxptswwkcircwuhcavhdparjfkjypkyxhbgwxbkvpvrtzjaetahmxevmkhdfyidhrdeejapfbafwmdqjqszwnwzgclitdhlnkaiyldwkwwzvhyorgbysyjbxsspnjdewjxbhpsvj”

测试结果:“h”

期望结果:“t”

原因:

第一版代码是通过使用HashMap来统计字符串s中每个字符的出现次数,然后遍历字符串t,判断每个字符是否在HashMap中存在,并且出现次数大于0。如果存在,就将对应的字符从HashMap中移除,最后剩下的字符即为多出的字符。

在提供的测试用例中,输出结果与预期结果不符合。这是因为测试用例中的字符串t包含了重复的字符,而原始代码在统计字符出现次数时只考虑了s字符串中的字符,没有考虑到t字符串中可能存在重复字符。


// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public char findTheDifference(String s, String t) {
        HashMap<Character,Integer> map = new HashMap<>();
        if (s.isEmpty()) {
            return t.charAt(0);
        }
        for (char c : s.toCharArray()) {
            map.put(c,1);
        }
        for (char c : t.toCharArray()) {
            if (null!= map.get(c)) {
                map.remove(c);
                continue;
            }
            return c;
        }
        return ' ';
    }
}

修改:

修改原始字符串s中的字符出现次数加1,然后遍历字符串t,对于每个字符,如果在HashMap中出现次数为0或者不存在,那么该字符就是多出的字符。

// 仅是我的思路代码,leetcode上大神更厉害
public char findTheDifference(String s, String t) {
    HashMap<Character, Integer> count = new HashMap<>();
    for (char c : s.toCharArray()) {
        count.put(c, count.getOrDefault(c, 0) + 1);
    }
    for (char c : t.toCharArray()) {
        if (!count.containsKey(c) || count.get(c) == 0) {
            return c;
        }
        count.put(c, count.get(c) - 1);
    }
    return ' ';
}

时间复杂度:O(n)


空间复杂度:O(n)


还有其他的思路解决,这里我就不列举代码了

这题好多思路啊 (╯°Д°)╯︵ ┻━┻


计数:

思路:遍历字符串s和t,可以使用数组来记录字符出现的次数。先遍历字符串s,将每个字符的出现次数加1;然后遍历字符串t,将每个字符的出现次数减1。最后遍历数组,找到出现次数不为0的字符,即为多出的字符。

时间复杂度:O(n),其中n为字符串的长度。

空间复杂度:O(∣Σ∣),其中Σ表示字符集,本题中字符集大小为26。


求和:

思路:分别计算字符串s和t中每个字符的ASCII码值之和,然后将两者的差值转换为字符,即为多出的字符。

时间复杂度:O(n),其中n为字符串的长度。

空间复杂度:O(1)。


位运算:

思路:将两个字符串拼接成一个字符串,然后将该字符串中每个字符的ASCII码值进行异或操作,最终得到的结果就是多出的字符。

时间复杂度:O(n),其中n为字符串的长度。

空间复杂度:O(1)。


相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
59 3
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
47 0
|
23天前
|
算法 安全
散列值使用相同的哈希算法
当使用相同的哈希算法对相同的数据进行散列时,所产生的散列值(也称为哈希值或摘要)总是相同的。这是因为哈希算法是一种确定性的函数,它对于给定的输入将始终产生相同的输出。 例如,如果你用SHA-256算法对字符串"hello world"进行哈希处理,无论何时何地,只要输入是完全一样的字符串,你都会得到相同的160位(40个十六进制字符)的SHA-256散列值。 但是,需要注意的是,即使是输入数据的微小变化也会导致产生的散列值完全不同。此外,不同的哈希算法(如MD5、SHA-1、SHA-256等)会对相同的数据产生不同的散列值。 哈希算法的一个关键特性是它们的“雪崩效应”,即输入中的一点小小
30 4
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
35 2
|
2月前
|
存储 算法 C#
C#哈希查找算法
C#哈希查找算法
|
2月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
51 0
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
4月前
|
算法 安全 JavaScript
安全哈希算法:SHA算法
安全哈希算法:SHA算法
104 1
安全哈希算法:SHA算法
|
4月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
654 1

热门文章

最新文章