力扣之找不同

ByteAuroraPulse
• 阅读 1392

问题描述

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

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

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

示例 1:

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

示例 2:

输入:s = "", t = "y"
输出:"y"
力扣原题目地址:https://leetcode.cn/problems/...
 

解法一 转数组对比删除

思路

把长字符串t转成数组,同时遍历短字符串s,可以拿到s中的每一项,然后把同样项,在t数组中删掉(ts多一项,s中有的t中一定有)

比如t'abc's'ab',那么不停对比,不停删除,最后t中只剩一个'c',是s中没有的,即为t中添加的字母。即找到了,代码如下:

代码

var findTheDifference = function (s, t) {
    let stack = t.split('') // 1. 把长字符串t转成数组
    for (let j = 0; j < s.length; j++) { // 2. 遍历短字符串s
        let ind = stack.indexOf(s[j]) // 3. 拿到这一项在对应数组中的索引位置
        stack.splice(ind, 1) // 4. 并做对应删除,就这样不停删除,数组中就会只剩一个了
    }
    return stack[0] // 5. 剩的这一个就是t中被添加的字母
};

解法二 统计t和s字符串合并后单词出现的次数(找奇数)

思路

  1. 首先把ts字符串做一个合并,然后统计各个字母出现的字数。
  2. 已知ts本来长得就一样的,只不过t多了一个字母。
  3. 假设ts一样的,那么两个字符串合并以后统计下来,每个字母出现的次数都是偶数
  4. 现在t多了一个字母,所以便会出现某个字母出现的次数是奇数
  5. 次数为奇数的那个字母,就是t中被添加的字母

代码

var findTheDifference = function (s, t) {
    let ss = s + t // 1. 合并字符串
    let map = new Map() // 2. 使用集合进行次数统计
    for (let i = 0; i < ss.length; i++) {
        if (map.has(ss[i])) {
            let count = map.get(ss[i])
            count = count + 1
            map.set(ss[i], count)
        } else {
            map.set(ss[i], 1)
        }
    }
    // 3. 统计好以后,遍历这个map结合,看看谁出现的次数是奇数
    for (const [key, value] of map) {
        if (value % 2 == 1) { 
            return key // 4. 次数为奇数的那个字母,就是t中被添加的字母
        }
    }
};

解法三 使用String.charCodeAt()方法和String.fromCharCode()方法

知识回顾

String.charCodeAt() 把字符串转换成Unicode数字值(UTF-16 编码单元)

console.log( 'a'.charCodeAt() ) // 97
console.log( 'b'.charCodeAt() ) // 98
console.log( 'c'.charCodeAt() ) // 99
console.log( 'd'.charCodeAt() ) // 100
console.log( 'e'.charCodeAt() ) // 101

既然字符串可以转换成数字类型的Unicode值,那么数字类型也可以转回去(前提是有的情况下)

String.fromCharCode()把数字值转回对应的字符串

console.log( String.fromCharCode(97) ) // 'a'
console.log( String.fromCharCode(98) ) // 'b'
console.log( String.fromCharCode(99) ) // 'c'
console.log( String.fromCharCode(100) ) // 'd'
console.log( String.fromCharCode(101) ) // 'e'

这两个api平常用的不多,所以有时候可能想不起来,但是在这里却是能够发挥作用

思路

  1. 由上述可知,一个字母代表一个数值,ts原本是相等的,只不过t多了一个字符串字母,所以。
  2. 可以把t中的字符串都转成数字,并累加一块;同理把s中字符串都转成数字,也累加一块
  3. 因为ts多了一个字母,所以累加的时候多了一个数。所以二者的累加和相减就是多的那个字母所对应的数字
  4. 然后再通过String.fromCharCode()方法把数字转回字符串即可

代码

 var findTheDifference = function (s, t) {
    // 1. 定义两个变量用于累加
    let countT = 0
    let countS = 0
    for (let i = 0; i < t.length; i++) {
        let item = t[i]
        countT = countT + item.charCodeAt() // 2. 字母转Unicode数字
    }
    for (let j = 0; j < s.length; j++) {
        let item = s[j]
        countS = countS + item.charCodeAt() // 2. 字母转Unicode数字
    }
    // 3. 二者的差值数,转成字符串字母就是多的那个字母
    return String.fromCharCode(countT - countS)
};
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
3年前
盘点JavaScript中Eval函数的使用方法
大家好,我是进阶学习者。一、前言内建函数eval函数允许执行一个代码字符串。语法:letresulteval(code);例:letcode'alert("Hello")';eval(code);//Hello运行结果:代码字符串可能会比较长,包含换行符、函数声明和变量等。eval的结果是最后一条语句的结果。例:let
虾米大王 虾米大王
2年前
java代码092
code092.jsp通过FindServlet类查询分页数据所有图书信息ID图书名称价格数量作者<%Listlist1(List)request.getAttribute("list");for(code089book:list1)%
虾米大王 虾米大王
2年前
java代码099
code099.jspInserttitlehere$pageScope.user.name
虾米大王 虾米大王
2年前
java代码073
code073.javapackagepack02;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.UUID;importjavax.servlet.ServletException;importjavax.servlet.annotation.Multip
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Stella981 Stella981
3年前
JQuery中对option的添加、删除、取值
jQuery获取Select选择的Text和Value:1\.$("select\_id").change(function(){//code...});  //为Select添加事件,当选择其中一项时触发2\.varcheckText$("select\_id").find("option:selected").text();  
Stella981 Stella981
3年前
LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
459\.重复的子字符串459\.RepeatedSubstringPattern题目描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。<spanclass"badgebadgepillbadgedanger"LeetCod
Stella981 Stella981
3年前
LeetCode459. 重复的子字符串
1.问题描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例1:输入:“abab”输出:True解释:可由子字符串“ab”重复两次构成。示例2:输入:“aba”输出:Fal
分布式系统的主键生成方案对比 | 京东云技术团队
UUID​UUID(通用唯一识别码)是由32个十六进制数组成的无序字符串,通过一定的算法计算出来。为了保证其唯一性,UUID规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。