原题:

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

思路:

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

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

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

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

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

类型 乌鸦 麻雀 杜鹃
计数(只) 1 2 3

而且我并不知道具体有哪几个类型,所以我干脆把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字符串转化为字符数组sArraychar[]tArray=t.toCharArray();//把t字符串转化为字符数组tArrayfor (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)

总结

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

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

  1. 20210501:字符串与哈希表力扣专题学习记录

    字符串与哈希表力扣专题学习记录 题目 思路与算法 代码实现 写在最后 题目 字母异位词分组 无重复字符的最长子串 重复的DNA序列 最小覆盖子串 思路与算法 字母异位词分组 : 按照字母序排序后再映射 ...

  2. Java数据结构和算法:哈希表

    哈希表是一种数据结构,它可以提供快速的插入操作和查找操作. 哈希表的缺点:基于数组,数组创建后难于扩展.不能有序遍历 哈希化 把关键字转换成数组下标(哈希函数) 冲突(碰撞) 开放地址法 线性探测 / ...

  3. 沙师弟学数据结构与算法之哈希表

    哈希表 在学习Python的时候有时候会想,为什么dict和set的查找速度这么快,感觉就像是事先知道要找的元素的位置一样?在学完哈希表之后,这个问题也就够被很好的解释了. 定义 哈希表是一种根据关键 ...

  4. 06 数据结构与算法之哈希表(拉链法) (C语言实现)

    注:只给出C语言实现代码,涉及到的数据结构相关概念请自行阅读相关书籍或参考其他博文: 将哈希表理解为一个顺序表,顺序表里面存储的是一个链表(拉链法解决碰撞) 注:(hash & 0x7FFFF ...

  5. 算法笔记-哈希表之冰淇淋购买问题(Ice Cream Parlor)

    问题描述: sunny和johny两个人要到冰激凌店买冰淇淋.店里每次都有很多种口味,每种口味有自己的单价.他们俩一共带的钱总数为money.所有口味的单价组成一个列表是array.要求两个人必须将所 ...

  6. 数据结构与算法笔记(二) 线性表(数组描述)

    c++常用的数据描述方法是数组描述和链式描述,线性表可以用来说明这两方法,先介绍数组描述的线性表.后面再介绍链式描述的线性表. C++ STL容器vector和list相当于线性表的数组描述和链式描述 ...

  7. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  8. 【数据结构和算法】哈希表详解

      哈希函数构造方法: (1)直接定址法: (2)除留余数法:  解决哈希冲突的办法: 如果出现哈希冲突,循环向右找空的内存单元,作为新的哈希地址 线性探查法的缺点: 堆积现象(非哈希冲突):同义词争 ...

  9. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

最新文章

  1. android 微信分享没反应问题总结
  2. Windows创建自动化任务
  3. pytorch 创建神经网络
  4. 是的,又一次立FLAG了
  5. 大数据开发笔记(九):Flink基础
  6. IDL | 实验五 IDL数据可视化
  7. HTML学习总结(3)——Audio/Video
  8. Resnet 18网络模型
  9. win10去掉微软拼音的简繁体转换
  10. iphone通过iTunes12.7怎么设置铃声
  11. csirs参考信号_发送和接收点(TRP)及信道状态信息参考信号(CSI-RS)传输的方法与流程...
  12. Python入门进阶:68 个 Python 内置函数详解
  13. 汽车电子之功能安全产品设计过程
  14. C/C++ 语言 const 关键字
  15. 做速卖通的优势和不足
  16. Swift 周报 第九期
  17. 绿盟2016春季校招web前端笔试
  18. 数学一年级应用题_一年级下册数学应用题专项训练题
  19. vsCode中Server is already running from different workspace错误解决办法
  20. Android终端启用adb功能

热门文章

  1. 大华DSS视频综合应用平台webservice接口使用手册-php测试用例
  2. 基于Python实现英文单词学习系统
  3. 使用moment获取当天日期与下一天
  4. windows下配置公私钥
  5. CommandLineRunner和ApplicationRunner区别
  6. 软件工程技术--第一章 概述
  7. h5跳转微信小程序,短信外链外部跳转微信打开任意第三方网址url,抖音跳转微信添加好友直接方法?
  8. SLAM第12讲 建图实践部分
  9. window和frame的用法
  10. JavaScript代码优化 --- 长期更新