2019-11-17
It’s great to have dreams. 有梦想是好事。
题目 :
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人解答:(C版本)
第一想法就是想到先将两个字符串进行排序(字母是数字的ASCII 表示,可以当做数字对待),然后从头开始比较,找到不同,即为被添加的字母。 方法可行,就是效率太低,看了评论区大神的答案,羞愧难当。
void mySwap ( char * pa, char * pb)
{
char tmp = * pa;
* pa = * pb;
* pb = tmp;
}
void bubbleSort ( char * arr, int arr_size)
{
int isLoop = true;
for ( int i = arr_size- 1 ; ( true == isLoop) && i > 0 ; i-- )
{
isLoop = false;
for ( int j = 0 ; j < i; j++ )
{
if ( arr[ j] > arr[ j+ 1 ] )
{
mySwap ( & arr[ j] , & arr[ j+ 1 ] ) ;
isLoop = true;
}
}
}
}
char findTheDifference ( char * s, char * t) {
int i= 0 ;
bubbleSort ( s, strlen ( s) ) ;
bubbleSort ( t, strlen ( t) ) ;
for ( i= 0 ; i< strlen ( s) ; i++ )
{
if ( s[ i] != t[ i] )
{
return t[ i] ;
}
}
return t[ i] ;
}
他山之石:
想到位操作的都是大神呀 前提:数字与自身异或结果为0。 那么我们可以将两个字符串异或,剩下的就是被添加的,效率杠杠的。 异或的性质如下: 利用上面的第1条和第三条,使用C语言实现如下:
char findTheDifference ( char * s, char * t) {
char res;
res = t[ strlen ( t) - 1 ] ;
for ( int i= 0 ; i< strlen ( s) ; i++ )
{
res ^ = s[ i] ^ t[ i] ;
}
return res;
}