【LeetCode】389_找不同_C
题目描述
给定两个字符串 s
和 t
,它们只包含小写字母。
字符串 t
由字符串 s
随机重排,然后在随机位置添加一个字母。
请找出在 t
中被添加的字母。
https://leetcode.cn/problems/find-the-difference/description/
示例
示例 1:
输入:s = "abcd", t = "abcde" 输出:"e" 解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y" 输出:"y"
解题总结
本题可用三个方法来解决
- 方法1
首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。
此方法也是我解题时所用的方法,与“383.赎金信”一样,都是用哈希表的思想来解决问题
- 方法2
分别对字符串 s 和 t 中每个字符的 ASCII 码的值求和,两者的差值即为被添加的字符
- 方法3
将两个字符串拼接成一个字符串,则问题转换成求字符串中出现奇数次的字符,对这两个字符串中所有的字符逐个异或,最后的结果即为被添加的字符
异或运算的特点是
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
0 ^ x == x
x ^ x == 0
x ^ y == y ^ x
x ^ y ^ x == y
异或运算满足交换律和结合律,因此在本题中,字符串异或运算的过程大致可抽象为
a ^ c ^ b ^ c ^ d ^ a ^ d == a ^ a ^ c ^ c ^ d ^ d ^ b == 0 ^ 0 ^ 0 ^ b == b
b 即为被添加的字符
代码实现
- 方法1的代码实现
char findTheDifference(char* s, char* t) { int hash[26] = {0}; int i = 0; while(s[i] != 0) { hash[s[i] - 'a']++; i++; } i = 0; while(t[i] != 0) { hash[t[i] - 'a']--; i++; } char c = 0; for(i = 0; i < 26; i++) { if(hash[i] == -1) c = i + 'a'; } return c; }
- 方法2的代码实现
char findTheDifference(char* s, char* t) { int sum_s = 0; int sum_t = 0; int i = 0; for(i = 0; i < strlen(s); i++) sum_s += s[i]; for(i = 0; i < strlen(t); i++) sum_t += t[i]; return sum_t - sum_s; }
- 方法3的代码实现
char findTheDifference(char* s, char* t) { int ret = 0; int i = 0; for(i = 0; i < strlen(s); i++) ret = ret ^ s[i]; for(i = 0; i < strlen(t); i++) ret = ret ^ t[i]; return ret; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具