力扣389.找不同

A.题目描述

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

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

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

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:

输入:s = "", t = "y"
输出:"y"
 

提示:

0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-the-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

B.题解思路:

        (a)解法1哈希表法

                .对于解法1,主要用于练习数据结构中的hash表,我们用数组创建一个hash表,再存入s与t中的字母,当查找到s中的字母是在其索引位置做加1操作,当查找到t中字母时做减1操作,最后遍历数组,不为0的即为不同的字母。

在此题解中可以学到两种比较有用的解题技巧,(1):如何用数组创建hash表并将26个英文字母存入,即用内置函数获取字母的ASCII码并减去'a',再在一个循环中依次存入26个字母(可能解释的不怎么清楚,请看代码,并会一目了然)(2):如何不开辟而外的空间去做比较的操作,即在一个数组的基础上做加1和减1操作,如果有额外的字母其索引处的值一定不为0!!!

        (b).代码:

        

class Solution {
    //Hash Table
    //N is the size of t
    //Time complexity: O(N)
    //Space complexity :O(1)
    public char findTheDifference(String s, String t) {
        int sizeS = s.length();
        int sizeT = t.length();
        //如果s为0则t中只有一个字母,直接返回
        if (sizeS == 0) {
            return t.charAt(0);
        }
        int[] table = new int[26];
        for (int i = 0; i < sizeT; i++) {
            if (i < sizeS) {    //对于s,每个数字都加1
                table[s.charAt(i) - 'a']++;
            }
            table[t.charAt(i) - 'a']--;     //对于t,每个数字都减去1
        }
        //此时入果hash表中的某个元素不为0,则为多出来的哪一个字母
        for (int i = 0; i < 26; i++) {
            if (table[i] != 0) {
                return (char)('a' + i);
            }
        }
        return 'a';
    }
}

(c)补充解释:

for (int i = 0; i < sizeT; i++) {
     if (i < sizeS) {    //对于s,每个数字都加1
         table[s.charAt(i) - 'a']++;
      }
       table[t.charAt(i) - 'a']--;     //对于t,每个数字都减去1
 }
     //此时入果hash表中的某个元素不为0,则为多出来的哪一个字母
for (int i = 0; i < 26; i++) {
     if (table[i] != 0) {
     return (char)('a' + i);
     }

对于第一个for循环的操作,其实通过charArt()函数获取每个字母的ASCii码减去'a'作为hash表的索引,这样就可以使用连续的空间将26个英文字母存入,如果要得到对应的字母时再将其通过(char)('a' + 索引值)的操作将其获取,这也是第二个for循环做的操作。

        (b)解法2:算数运算法:

                  定义一个total变量存储t中每个字母的ASCII码值的总和,再减去s中每个字母的ASCII码值的总和,最后得到的差值就是所求的不同元素的ASCII码,再将其转换为char类型返回

           代码:

class Solution {
    //加法运算
    //N is the size of t
    //Time complexity: O(N)
    //Space complexity; O(1)
    public char findTheDifference(String s, String t) {
        int sizeS = s.length();
        int sizeT = t.length();
        int total = 0;  //记录所有的字母的AScll码之和
        //用t中所有字母的AScall码减去s中所有字母的Acsall码值
        //再次强转为char类型返回
        for (int i = 0; i < sizeT; i++) {
            total += t.charAt(i);
            if (i < sizeS) {
                total -= s.charAt(i);
            }
        }
         return (char)total;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值