数据结构与算法笔记:哈希表——力扣389

原题

        给定两个字符串 s 和 t ,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。

思路

        首先咱们抛开编程知识,就当它是咱们日常生活中随时可能遇见的问题,比如有些时候不解开鞋带就想穿鞋子,却怎么也穿不进去,怎么办?当然是静下心来,从实际出发,把鞋带解开再穿啊。做编程题亦是如此,从实际出发,深挖原题字眼,而不是题还没读,就先去想一些之前学过的数据结构和算法(我就是这样)。

        我们先把题目“大卸八块”。

        “只包含小写字母,意味着这两个数组里面的元素再怎么变都逃不出26个字母的手掌心。即,林子里有些啥类型的鸟咱们是一清二楚的,不清楚的是每种类型的鸟有几只。

        t由s随机重排  ,并在随机位置添加一个字母这说明这两个林子里面的鸟不仅类型一模一样,而且数量还几乎差不多,只相差一只鸟。唯一区别大的点在于这些鸟栖息的树不一样。

        然后,它问:请找出在 t 中被添加的字母。不就相当于在问:兄弟,用你毕生所学,告诉我,t这个林子里多了哪只鸟呢?想像这不是一道编程题,数据结构算法我都不知道,我就是一个护林员,我会怎么做?很简单啊,分别统计出两个林子里每一种类型的鸟的个数,比一比不就知道了吗?既然是统计,我得做两张表吧?一份记t林子,一份记s林子。比如这样:

类型乌鸦麻雀杜鹃
计数(只)123

而且我并不知道具体有哪几个类型,所以我干脆把26种类型的鸟先全写表上,数到一只就在对应类型的鸟下面“+1”。最后只要把两张表一对比,答案就出来了。

        按理说这样就可以了,但是我还想偷个懒。妙就妙在这个偷懒上。比如我在t这个林子里看见了a鸟,那我就在t表里面的a下面记个“+1”,然后我又在s林子里看见了a鸟,按理说我这个时候应该在s表的a下面记个“+1”,但是我转念一想,为什么不在t表里的a下面记一个“-1”呢?我何必用两张表呢?恶趣味地想一想哈:如果我让两个林子里的同类型的鸟一对一打架,比如s里的b和t里的b打架,并且假设最后双方会同归于尽,那么肯定会存活下来一只鸟,这只鸟不就是我在找的那只吗?这样想的话,我用一张表就可以了,在t里看见一只a,我就“+1”,在s里看见一只a,我就“-1”。因为t本来就比s多一只鸟,所以最后表上一定会有一个“+1”,而它就是我要找的鸟。

        好,下面我们来付诸实践。首先,要画一张包含26种类型鸟的表。它长啥样呢?起码它得有两行吧,第一行写类型,第二行计数。那么我们用哪一种数据结构呢?我们先来考虑最简单的数组,数组有索引和值两部分,想一想,是不是刚好对应前面的类型和计数呢?我们将类型作为索引,计数作为值。这时候就会有小伙伴问:索引不都是0,1,2......这种int型数据吗?可是类型里面的可是a,b,c......这种char型数据啊,怎么办?这个时候,就要引入ASCLL码这个知识点了。关于ASCLL码,我们现在只需要知道,int型数据可以与char型数据相互转化,比如:'a'=97,'b'=98......这样,类型就可以用数字来表示了,但是,索引一般是从0开始的,所以我们还要减去97,这样,我们就获得了26种类型:0,1,2......25,(其实就是数字化后的a,b,c......z)并将它们作为索引。

        至于计数部分就很简单了。首先题目给出了s和t这两个字符串,既然我们要一个个地数,就免不了要把这字符串“分崩离析”——将字符串转化为字符数组,然后分别遍历t对应的字符数组(tArray)和s对应的字符数组(sArray),tArray里遇见鸟就在总表“+1”,sArray里遇见鸟就在总表“-1”。全部数完之后,再遍历一遍那一张总表,哪种类型的鸟下面是“+1”(因为t里面的字母要比s里面的多1个),那么答案就是谁。当然,最后返回结果的时候不仅要加上那减去的97,还要将int型强制转化为char型才可以哦。

 代码

接下来是用IntelliJ IDEA来编写代码。

1.打开IntelliJ IDEA(下载安装过程咱就不赘述了哈),建议大家不要用社区版,只要有大学里面自己的电子邮箱,都是可以用专业版的。

2.新建项目,选择空项目。

3.随便取一个项目名称。

4.点击左侧项目设置栏的项目,此时会看到右侧“<无SDK>

5.点开,我选择的是18(成年版本,笑),

  6.点开左侧项目设置栏的模块,选择中间上方的加号,并选择新建模块。

7. 会看到如下画面,啥也不用管,下一步就完了。

8.然后是给你的模块取一个名字,我取的是leetcode。然后就是不停地下一步和确定。

9.最后应该是酱紫的画面。

10.右击左侧的蓝色的src文件夹,新建一个软件包,至于命名的话,因为我是在学习哈希表的过程中刷到这道题的,所以它的程序被我放在hashmap的软件包里面了,即该软件包我取名为hashmap(小写)。软件包新建完成后,再右击该软件包,新建一个java类,我取名为Solution389,表示这是一个力扣389题的解决方案。点击enter,就会出现这样的画面

11.然后你要去力扣网,找到这道题,把图中标蓝的地方复制进你的IDEA。

 12.结果如图。(有红色波浪线是因为没有返回值)

13.然后你就可以在里面愉快地写代码啦!最后结果如下。

14.代码(可复制)

public class Solution389 {
    public char findTheDifference(String s, String t) {
        int[]  hashMap=new int[26];//创建总表,此时数组里默认所有值为0.
        int res=0;//res就是result的意思,之后要作为返回值返回。
        char[]sArray=s.toCharArray();//把s字符串转化为字符数组sArray
        char[]tArray=t.toCharArray();//把t字符串转化为字符数组tArray
        for (char c : sArray) {
            int temp=(int)c-97;
            hashMap[temp]--;//temp类型所对应的计数“-1”
        }
        for (char c : tArray) {
            int temp=(int)c-97;
            hashMap[temp]++;//temp类型所对应的计数“+1”
        }
        for (int i = 0; i < hashMap.length; i++) {//遍历总表
            if(hashMap[i]==1)
                res=i+97;//加回减去的97
        }
        return (char) res;//将int强制转化为char
    }    
}

小技巧

一.IDEA快捷键总结(windows)

1、ctrl+p:查看要填入的参数

2、ctrl+shift+n:查找文件

3、ctrl+shift+fn+f12:窗口最大化

4、alt+tab:切换相邻窗口

5、alt+fn+ins:创建set和get方法

6、alt+enter:查看异常

7、ctrl+alt+v:快速创建变量

8、shift+enter:自动换行

9、ctrl+alt+n:自动将变量放入原文

10、shift+f6+fn:修改变量名

11.输入数组名.for或者是数组名.fori可以直接写出for语句

二.如何将麻衣学姐装进你的IDEA

1.左上角——文件——设置——外观与行为——外观——背景图像——不透明度调为15

安利

 1.学习数据结构和算法+刷力扣手把手带你刷Leetcode力扣|各个击破数据结构和算法|大厂面试必备技能【已完结】_哔哩哔哩_bilibili

2.系统学习java

Java基础+进阶_哔哩哔哩_bilibili

3.JDK18的API(相当于说明书)

Overview (Java SE 18 & JDK 18) (oracle.com)

总结

写这篇文章的目的之一是巩固自己已学的知识,同时如果能帮到大家一些的话就更好了。

  

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值