2022.1.30 LeetCode总结

这篇博客总结了LeetCode的389题——找到字符串t中添加的字母,提供了两种解题思路,并介绍了ASCII码在计算机存储和运算中的作用。通过例子和代码解析了如何利用ASCII码差值找到额外的字符。
摘要由CSDN通过智能技术生成


一、今日刷题

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;

/**
 * @author: LYZ
 * @date: 2022/1/30 19:25
 * @description: 389.给定两个字符串 s 和 t ,它们只包含小写字母。
 * 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
 * 请找出在 t 中被添加的字母。
 */
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<Character, Integer> 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 种可能的字符。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值