2022.1.30 LeetCode总结

2022.1.30 LeetCode总结,第1张

2022.1.30 LeetCode总结

文章目录

一、今日刷题

1. 第二部分:字符 -- 389.找不同 二、知识积累:

1. ASCII码:


一、今日刷题 1. 第二部分:字符串 – 389.找不同

跳转LeetCode

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

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

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

示例 1:

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

输入:s = “”, t = “y”
输出:“y”


答案代码

错误代码:无法解决a + aa这种情况(修改方法写在注释里了,其实最后的return语句写的也不好,学习题解是怎么写的)

package String;

import java.util.HashMap;
import java.util.Map;


public class FindTheDifference {
    public static void main(String[] args) {
        FindTheDifference findTheDifference = new FindTheDifference();
        char ans = findTheDifference.findTheDifference("ascd", "safcd");
        System.out.println(ans);
    }

    public char findTheDifference(String s, String t) {
        Map ans = new HashMap<>();
        char result = ' ';
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            int frequency = ans.getOrDefault(c, 0);
            ans.put(c, frequency + 1);
        }
        for (int j = 0; j < t.length(); j++) {
            char c = t.charAt(j);
            int frequency = ans.getOrDefault(c, 0);
            ans.put(c, frequency + 1); //ans.put(c, frequency - 1);
        }
        for (int m = 0; m < t.length(); m++) {
            if (ans.get(t.charAt(m)) == 1) { //if (ans.get(t.charAt(m)) < 0)
                result = t.charAt(m);
            }
        }
        return result;
    }
}

题解方法①:

首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。
(其实我用哈希表就是这种思想)

class Solution {
    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 ' '; //学习这个return的全过程
    }
}


题解方法②:

将字符串 s 中每个字符的 ASCII 码的值求和,得到 A_s;对字符串 t 同样的方法得到 A_t 。两者的差值 A_t - A_s 即代表了被添加的字符。
(体会ASCII码是怎么计算的!)

class Solution {
    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);
    }
}
二、知识积累: 1. ASCII码:

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5715565.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存