日新计划389. 找不同

131 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

一、题目描述:

389. 找不同

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

字符串 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 只包含小写字母

二、思路分析:

  • 先将两个字符串转为char数组
  • 排序
  • 遍历下标0到s.length-1的两数组元素,一旦发现有c1[i] != c2[i],这个c2[i]就是返回的结果
  • 如果遍历过程中没有发现不等的情况,说明这个新插入的字符一定是c2数组的最后一个字符,返回c2[t.length-1]。

官方解法--求和(很巧妙)

  • 遍历s和t两个字符串,将它们的值相加
  • tSum - sSum的差值就是新添加的元素,返回差值即可,注意转换成char类型

官方解法二--计数

遍历s时,出现的字符就在相应的下标对应的位置+1,接着遍历t,每遍历一个元素就在相对应的位置让计数-1,直到最后,数组中元素为1的那个就是我们要得到的结果,将下标+'a'就是字符。

三、AC 代码:

class Solution {
    //我的解法
    public char findTheDifference1(String s, String t) {
        if ( s.equals("") || s.length() == 0){
            return t.charAt(0);
        }

        char[] c1 = s.toCharArray();
        char[] c2 = t.toCharArray();
        Arrays.sort(c1);
        Arrays.sort(c2);
        for (int i = 0; i < c1.length; i++) {
            if (c1[i] != c2[i]){
                return c2[i];
            }
        }
        return c2[t.length()-1];
    }

    //官方解法一:使用计数,最后扫描完t后,最后一个数量为1的就是结果
    // public char findTheDifference(String s, String t) {
    //     int[] cnt = new int[26];
    //     for (int i = 0; i < s.length(); ++i) {
    //         char ch = s.charAt(i);
    //         cnt[ch - 'a']++;
    //     }
    //     for (int i = 0; i < t.length(); ++i) {
    //         char ch = t.charAt(i);
    //         cnt[ch - 'a']--;
    //         if (cnt[ch - 'a'] < 0) {
    //             return ch;
    //         }
    //     }
    //     return ' ';
    // }

    public char findTheDifference(String s, String t) {
        int as = 0, at = 0;
        for (int i = 0; i < s.length(); ++i) {
            as += s.charAt(i);
        }
        for (int i = 0; i < t.length(); ++i) {
            at += t.charAt(i);
        }
        return (char) (at - as);
    }
}