LeetCode题目笔记——389. 找不同/Python/C++

2023-11-15

题目描述

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

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

请找出在 t 中被添加的字母。
示例 1:

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

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

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

在这里插入图片描述

题目难度——简单

方法一:使用哈希表计数出现次数

  字符串t只比s多了一个字符,也就是说有一个字符的出现次数会比其他字符多1,那么我们就可以先遍历一次字符串s,用一个字典存储每个字母出现的次数,然后再遍历一次字符串t,遍历的同时对每个字母出现的次数减1,直到出现次数小于0的字母,返回这个字母就是答案。

代码/Python

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        table = dict()
        for i in range(len(s)):
            table[s[i]] = table.get(s[i], 0) + 1
        for i in range(len(t)):
            table[t[i]] = table.get(t[i], 0) - 1
            if table[t[i]] < 0:
                return t[i]
        
        return ' '

在这里插入图片描述
  40ms,打败70%。还能提速,两遍遍历的查询操作,加一减一操作有点多。注意不能在遍历t的时候直接table[i] -= 1,因为t有可能添加一个在s中没有出现过的字母,直接这样写的话会报错。

方法二:利用字母的ASCII码

  每个字母都有特定的ASCII码值,从这个角度出发,题目就可以理解为从两串不同数字中找出第二串数字中多出的那个数字。那么我们就可以同样两次遍历字符串,用两个变量记录两个字符串中所有字母的ASCII码总和,最后返回差值代表的字母即可。

代码/C++/Python

class Solution {
public:
    char findTheDifference(string s, string t) {
        int totals = 0, totalt = 0;
        for(auto w:s){
            totals += w;
        }
        for(auto w:t){
            totalt += w;
        }
        return totalt - totals;
    }
};

在这里插入图片描述

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        totals, totalt = 0, 0
        for w in s:
            totals += ord(w)
        for w in t:
            totalt += ord(w)
        return chr(totalt - totals)    

在这里插入图片描述

方法三:位运算

  根据异或运算的规则,相同为假,相异为真,t只比s多了一个字母,其他的字母全是一样的,那么如果我们把未添加新字母的t和s进行异或,最后肯定就是0。0再和任何字母异或还是那个字母本身,就得到了答案。

class Solution {
public:
    char findTheDifference(string s, string t) {
        int res = 0;
        for(char w:s){
            res ^= w;
        }
        for(char w:t){
            res ^= w;
        }
        return res;
    }
};

在这里插入图片描述

总结

  三种方法都要进行两次遍历,第一种方法所做的操作要略多一点,但三种方法都是O(N)的,方法一的空间是O©,其中C是出现的字符数,最多也就是26个字母,所以是常数级别,方法二三只用到了一两个变量,所以空间算O(1)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode题目笔记——389. 找不同/Python/C++ 的相关文章

随机推荐

  • Python金融系列第四篇:置信区间和假设检验

    作者 chen h 微信号 QQ 862251340 微信公众号 coderpai 第一篇 计算股票回报率 均值和方差 第二篇 简单线性回归 第三篇 随机变量和分布 第四篇 置信区间和假设检验 第五篇 多元线性回归和残差分析 第六篇 现代投
  • 用chatgpt写论文可行吗,查重率会达到多少

    AI工具国内体验 关注 码视野 回复关键字 1002 选题 题目 物联网技术在智能家居系统中的应用研究 概要生成 问 请以 物联网技术在智能家居系统中的应用研究 为课题 写一篇物联网专业本科毕业论文的摘要 不少于400字 答 随着人们生活水
  • 单内核与微内核

    单内核是个很大的进程 它的内部又能够被分为若干模块 或是层次或其他 但是在运行的时候 他是个单独的二进制大映象 其模块间的通讯是通过直接调用其他模块中的函数实现的 而不是消息传递 在运行效率上 单内核会具有一定的好处 单内核结构是非常有吸引
  • 前端将后端返回的文件流转为excel并下载

    1 目的 将文件流转为excel并进行下载 下面图片是发请求之后 后端返回的文件流 想要实现的效果是将文件流转为excel并进行下载 2 实现步骤 2 1 utils exportFile js export function export
  • npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

    npm 无法将 npm 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再试一次 目录 一 报错 二 解决 1 安装node js node js安装过程中的报错问题 解决nod
  • ThinkPHP5多语言切换项目实战

    ThinkPHP5多语言切换实战 1 在配置文件中开启多语言配置 2 然后添加多语言目录 这里创建你需要的语言包 在语言包里定义需要翻译的文本 中英文数组的键名写成一致 然后在html文件里输入 lang 键名 对应的键名 就是下图的写法
  • unity shader加载序列帧图片

    先设置序列帧图WarpMode 为Repeat Shader部分 Shader My Sequence Properties Opacity 透明度 range 0 1 0 5 Sequence 序列帧 2d gray RowCount 行
  • global clk 的 skew & jitter

    ku040 的 skew 同一个 clk 下的不同寄存器 clk 到达时间可能会差 300ps 跟 clk 走线的长度相关 一般同一个 bank内 clk 在 30ps 之内 但是不同的 clk 即使从同一个 mmcm pll 的不同管脚发
  • 【C语言的栈溢出问题以及部分解决】

    C语言的栈溢出问题 例如 针对学习过程中遇到的栈溢出问题 C语言的栈溢出问题 前言 栈溢出 Stack overflow 导致栈溢出的原因 函数递归层次太深 1 修改栈区空间大小 2 尾部递归优化 附一 设置优化选项 O1 O2 附二 解决
  • idea中 mybatis 的 mapper.xml 新建没有 头文件

    idea中 mybatis 的 mapper xml 新建没有 头文件 解决步骤 1 直接 settings 2 直接 选择 MybatisMapper 添加
  • C6678多核DSP开发——image_processing例程

    前言 这篇学习笔记记录了在DSP上实现简单图像处理算法的image processing例程 该例程在CCS安装时安装在目录下 主要实现了对图像的分割 灰度处理以及边缘检测 学会了调用和修改DSP例程以及图像处理基本程序框架 1 打开CCS
  • iOS 的 APP 在系统中如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?

    iOS 的 APP 在系统中如何适应 iPhone 5s 6 6 Plus 三种屏幕的尺寸 iOS开发如何标准化的适应新的iPhone 5s iPhone6 6 Plus 是否有一种一劳永逸的解决方法 而不需要设计师针对不同的尺寸单独进行设
  • 基础算法题——炎炎消防队(取巧、三分)

    炎炎夏日 题目描述 夏天的重庆格外地炎热 很容易起火 消防士们都全副武装 一旦发生险情就立马赶往救火 森罗是消防队中的一员 他在灭火的过程中突发奇想 如果能用退火的原理求解函数求最小值 那不就可以很容易计算了吗 翌日 森罗来到即将高考的弟弟
  • Android中如何重新启动应用APP或重启系统

    重新启动应 程序 有两种 法 分别是 1 通过ActivityManager来重新启动应 程序 java 代码 ActivityManager manager ActivityManager this getSystemService Co
  • pm grant 命令

    CustomLocale apk所需要的权限 android permission CHANGE CONFIGURATION 自Android 4 2 4 2 2起系统定义为android protectionLevel signature
  • java学习笔记——众筹项目练习——前台系统的实名认证功能、ajax发送跨域请求、后台manager系统的实名认证人工审核

    实名认证功能 前面的文章中我们实现了后台manager系统中的流程管理功能 并且将实名认证的流程上传到了服务器并完成部署 不过 仅仅是长传和部署当然不是我们的目的啦 我们上传这个实名认证流程时为了可以让前台的广大用户可以使用这个流程 怎么才
  • C++ Primer 第五章 Statements

    C Primer 第五章 Statements 5 3 Conditional Statements 5 3 2 The switch Statement 5 4 Iterative Statements 5 4 3 Range for S
  • VScode 运行java出现exited with code=1 in 0.695 seconds的问题解决

    在运行vs中Java代码时 配置过程中可能会出现一些问题 导致运行结果为上述所示 在vs中运行Java代码时 首先要确保Java环境配置无误 出现下面的则证明配置成功 之后需要安装几个插件 最后就可以在vs中编写Java代码了
  • 使用C++调用C#的DLL

    SwfDotNet是C 编写的 作者的C 水平 真是令我佩服 这是个特别好的读写Swf文件的库 但是 我要用在C 项目中 怎么让C 调用C 的DLL呢 今天一上午都在琢磨这个问题 耽误了很多时间 原因是编译是出现 warning C4819
  • LeetCode题目笔记——389. 找不同/Python/C++

    文章目录 题目描述 题目难度 简单 方法一 使用哈希表计数出现次数 代码 Python 方法二 利用字母的ASCII码 代码 C Python 方法三 位运算 总结 题目描述 给定两个字符串 s 和 t 它们只包含小写字母 字符串 t 由字