龙空技术网

打基础之LeetCode算法题第64篇:这种换汤不换药的题你应该会解

吾是我师 309

前言:

当前朋友们对“leetcode算法题题解”都比较关注,同学们都需要分析一些“leetcode算法题题解”的相关资讯。那么小编同时在网上搜集了一些对于“leetcode算法题题解””的相关资讯,希望小伙伴们能喜欢,同学们快快来了解一下吧!

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对吧。

我计划每题给出两种语言的解决方案,一种静态语言,一种动态语言。

我选择C语言,Python和Java作为实现语言,由于篇幅有限,其他语言的实现有兴趣的朋友请自己尝试。

LeetCode 389. 找不同(Find the Difference)

问题描述:

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

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

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

示例:

C语言实现:

这种题目一拿上来就想排序是不对的,一般都是有巧解的。让我们分析这个问题。

题目的意思时说,t要比s多出一个字母出来,那么换句话说s+t组成的新字符串只有一个字母出现奇数次,其他所有字母都会出现偶数次。那么这个出现奇数次的字母就应该是我们要找的字母。

那么一直关注我的朋友们,应该马上就想到了解法。我们在“第41日”判断一个数组中只出现一次的数字问题的时候就说过,当一个数组中其他元素出现偶数次,只有一个元素出现奇数次的时候,要找到这个出现奇数次的元素,就可以用异或。

这个问题稍微复杂一点,但是换汤不换药。

所以我们的代码如下:

注意我们应该遍历最短的那个字符串,而不应该是最长的,否则会溢出,注意了。

这样算法的复杂度就可以达到O(len(t)))。

python语言的实现:

python的实现有些不同,因为对于c语言来说,char类型实际上是一种整数类型,所以可以像处理整型一样用异或。但是在python中不能。

我们稍微换一种思路,我们前面说过了,s+t组成的新字符串有一个特点,除了一个我们要找的字母出现奇数次外,其他都出现偶数次。那么我们要找不同,实际上就可以转换成找奇数和偶数的不同,那么就简单了。

我们可以统计s+t新字符串中每个字母出现的次数,组成一个字典,然后遍历这个字典,如果某个字母出现的次数是奇数,即不能被2整除,那么它就是我们要找的字母。

代码如下:

Java语言的实现:

Java的实现和C语言的实现相同。唯一有些不同的是,最好将两个字符串都转换成字符数组,然后通过下标来访问,这样比用直接用字符串对象的charAt()方法要快。

最后不要忘记强制类型转换。

代码如下:

标签: #leetcode算法题题解