哈希表题目:猜数字游戏
文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 解法一
- 思路和算法
- 代码
- 复杂度分析
- 解法二
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:猜数字游戏
出处:299. 猜数字游戏
难度
4 级
题目描述
要求
你在和朋友一起玩猜数字(Bulls and Cows)游戏。
你写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
- 「公牛」的数量,即猜测数字中有多少位数字在秘密数字中出现且位置正确。
- 「奶牛」的数量,即猜测数字中有多少位数字在秘密数字中出现但位置错误,即猜测数字中有多少位非公牛数字可以通过重新排列变成公牛数字。
给你一个秘密数字 secret\texttt{secret}secret 和朋友猜测的数字 guess\texttt{guess}guess,请你返回对朋友这次猜测的提示。
提示的格式为 "xAyB"\texttt{"xAyB"}"xAyB",x\texttt{x}x 是公牛个数,y\texttt{y}y 是奶牛个数。请注意 secret\texttt{secret}secret 和 guess\texttt{guess}guess 都可能含有重复数字。
示例
示例 1:
输入:secret="1807",guess="7810"\texttt{secret = "1807", guess = "7810"}secret = "1807", guess = "7810"
输出:"1A3B"\texttt{"1A3B"}"1A3B"
解释:数字和位置都对(公牛)用 ‘|’\texttt{`|'}‘|’ 连接,数字猜对位置不对(奶牛)用下划线表示。
"1807"\texttt{"1807"}"1807"
|\texttt{~~|} |
"7‾810‾"\texttt{"}\underline{\texttt{7}}\texttt{8}\underline{\texttt{10}}\texttt{"}"7810"
示例 2:
输入:secret="1123",guess="0111"\texttt{secret = "1123", guess = "0111"}secret = "1123", guess = "0111"
输出:"1A1B"\texttt{"1A1B"}"1A1B"
解释:数字和位置都对(公牛)用 ‘|’\texttt{`|'}‘|’ 连接,数字猜对位置不对(奶牛)用下划线表示。
"1123"\texttt{"1123"}"1123"
|\texttt{~~|} |
"011‾1"\texttt{"01}\underline{\texttt{1}}\texttt{1"}"0111"
或
"1123"\texttt{"1123"}"1123"
|\texttt{~~|} |
"0111‾"\texttt{"011}\underline{\texttt{1}}\texttt{"}"0111"
注意,两个不匹配的 1\texttt{1}1 中,只有一个会算作奶牛(数字猜对位置不对),因为通过重新排列非公牛数字之后只有一个 1\texttt{1}1 可以成为公牛数字。
示例 3:
输入:secret="1",guess="0"\texttt{secret = "1", guess = "0"}secret = "1", guess = "0"
输出:"0A0B"\texttt{"0A0B"}"0A0B"
示例 4:
输入:secret="1",guess="1"\texttt{secret = "1", guess = "1"}secret = "1", guess = "1"
输出:"1A0B"\texttt{"1A0B"}"1A0B"
数据范围
- 1≤secret.length,guess.length≤1000\texttt{1} \le \texttt{secret.length, guess.length} \le \texttt{1000}1≤secret.length, guess.length≤1000
- secret.length=guess.length\texttt{secret.length = guess.length}secret.length = guess.length
- secret\texttt{secret}secret 和 guess\texttt{guess}guess 仅由数字组成
解法一
思路和算法
公牛为 secret\textit{secret}secret 和 guess\textit{guess}guess 的相同下标处数字相同的下标个数,统计公牛的方法是:同时遍历 secret\textit{secret}secret 和 guess\textit{guess}guess,对于每个下标,如果 secret\textit{secret}secret 和 guess\textit{guess}guess 在相同下标处的数字相同,则将公牛的数量加 111。
奶牛为 secret\textit{secret}secret 和 guess\textit{guess}guess 的不同下标处数字相同的下标个数,统计奶牛的方法是:使用两个哈希表分别记录 secret\textit{secret}secret 和 guess\textit{guess}guess 中的每个数字的出现次数(排除公牛的情况),同时遍历 secret\textit{secret}secret 和 guess\textit{guess}guess,对于每个下标,如果 secret\textit{secret}secret 和 guess\textit{guess}guess 在相同下标处的数字不同,则将该下标处的两个数字在对应的哈希表中的出现次数分别加 111,遍历结束之后,000 到 999 的每个数字在奶牛中的数量为该数字在两个哈希表中的出现次数的较小值,计算每个数字在奶牛中的数量之和,即为奶牛的数量。
由于统计公牛和奶牛都需要同时遍历 secret\textit{secret}secret 和 guess\textit{guess}guess,因此可以在一次遍历中完成统计公牛和奶牛的操作。遍历过程中,如果 secret\textit{secret}secret 和 guess\textit{guess}guess 在相同下标处的数字相同则将公牛的数量加 111,如果 secret\textit{secret}secret 和 guess\textit{guess}guess 在相同下标处的数字不同则将该下标处的两个数字在 secret\textit{secret}secret 和 guess\textit{guess}guess 中的出现次数分别加 111,遍历结束之后遍历 000 到 999 在 secret\textit{secret}secret 和 guess\textit{guess}guess 中的出现次数,统计奶牛的数量。
实现方面,由于数字范围是 000 到 999,因此可以使用两个数组分别记录 secret\textit{secret}secret 和 guess\textit{guess}guess 中的每个数字的出现次数。
代码
class Solution {public String getHint(String secret, String guess) {int bulls = 0, cows = 0;int[] secretCounts = new int[10];int[] guessCounts = new int[10];int length = secret.length();for (int i = 0; i < length; i++) {int secretDigit = secret.charAt(i) - '0';int guessDigit = guess.charAt(i) - '0';if (secretDigit == guessDigit) {bulls++;} else {secretCounts[secretDigit]++;guessCounts[guessDigit]++;}}for (int i = 0; i < 10; i++) {cows += Math.min(secretCounts[i], guessCounts[i]);}return String.format("%dA%dB", bulls, cows);}
}
复杂度分析
-
时间复杂度:O(n+C)O(n + C)O(n+C),其中 nnn 是字符串 secret\textit{secret}secret 和 guess\textit{guess}guess 的长度,CCC 是数字的个数,C=10C = 10C=10。需要 O(n)O(n)O(n) 的时间遍历字符串 secret\textit{secret}secret 和 guess\textit{guess}guess 各一次统计公牛数量和每个数字的出现次数,需要 O(C)O(C)O(C) 的时间遍历 000 到 999 的所有数字统计奶牛数量。
-
空间复杂度:O(C)O(C)O(C),其中 CCC 是数字的个数,C=10C = 10C=10。需要使用两个哈希表分别记录 secret\textit{secret}secret 和 guess\textit{guess}guess 中的每个数字的出现次数。
解法二
思路和算法
解法一需要使用两个哈希表分别记录 secret\textit{secret}secret 和 guess\textit{guess}guess 中的每个数字的出现次数,在遍历 secret\textit{secret}secret 和 guess\textit{guess}guess 之后还需要遍历 000 到 999 的每个数字计算奶牛的数量。可以只用一个哈希表,在遍历 secret\textit{secret}secret 和 guess\textit{guess}guess 的同时计算奶牛的数量。
使用一个哈希表记录每个数字的出现次数(排除公牛的情况),遍历 secret\textit{secret}secret 和 guess\textit{guess}guess 的过程中,对于 secret\textit{secret}secret 中出现的每个数字将出现次数加 111,对于 guess\textit{guess}guess 中出现的每个数字将出现次数减 111。上述操作的思想是:对于 secret\textit{secret}secret 中的每个数字,只有当 guess\textit{guess}guess 中存在一个不同位置的相同数字时,才是一个奶牛,反之亦然。
当遍历到一个下标时,将 secret\textit{secret}secret 和 guess\textit{guess}guess 在该下标处的数字分别记为 secretDigit\textit{secretDigit}secretDigit 和 guessDigit\textit{guessDigit}guessDigit,如果 secretDigit=guessDigit\textit{secretDigit} = \textit{guessDigit}secretDigit=guessDigit 则将公牛的数量加 111,如果 secretDigit≠guessDigit\textit{secretDigit} \ne \textit{guessDigit}secretDigit=guessDigit 则按照如下操作统计奶牛:
-
如果哈希表中 secretDigit\textit{secretDigit}secretDigit 的出现次数小于 000,则在之前遍历的 guess\textit{guess}guess 的数字中有多余的 secretDigit\textit{secretDigit}secretDigit,因此将奶牛的数量加 111;
-
如果哈希表中 guessDigit\textit{guessDigit}guessDigit 的出现次数大于 000,则在之前遍历的 secret\textit{secret}secret 的数字中有多余的 guessDigit\textit{guessDigit}guessDigit,因此将奶牛的数量加 111;
-
将 secretDigit\textit{secretDigit}secretDigit 在哈希表中的出现次数加 111,将 guessDigit\textit{guessDigit}guessDigit 在哈希表中的出现次数减 111。
遍历结束之后,即可知道奶牛的数量。
代码
class Solution {public String getHint(String secret, String guess) {int bulls = 0, cows = 0;int[] digits = new int[10];int length = secret.length();for (int i = 0; i < length; i++) {int secretDigit = secret.charAt(i) - '0';int guessDigit = guess.charAt(i) - '0';if (secretDigit == guessDigit) {bulls++;} else {if (digits[secretDigit] < 0) {cows++;}if (digits[guessDigit] > 0) {cows++;}digits[secretDigit]++;digits[guessDigit]--;}}return String.format("%dA%dB", bulls, cows);}
}
复杂度分析
-
时间复杂度:O(n)O(n)O(n),其中 nnn 是字符串 secret\textit{secret}secret 和 guess\textit{guess}guess 的长度。需要遍历字符串 secret\textit{secret}secret 和 guess\textit{guess}guess 各一次统计公牛数量和奶牛数量。
-
空间复杂度:O(C)O(C)O(C),其中 CCC 是数字的个数,C=10C = 10C=10。需要使用一个哈希表记录每个数字的出现次数。
相关文章:
哈希表题目:猜数字游戏
文章目录题目标题和出处难度题目描述要求示例数据范围解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目 标题和出处 标题:猜数字游戏 出处:299. 猜数字游戏 难度 4 级 题目描述 要求 你在和朋友一起玩猜数字(Bulls…...
项目请求地址自动加上了本地ip的解决方式
一般情况下来说都是一些粗心大意的问题导致的 场景一:少加了/ 场景二:前后多加了空格 场景三:拼接地址错误![...
Vue3 企业级项目实战:项目须知与课程约定
本节内容很重要,希望大家能够耐心看完。 Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发,升职加薪,快人一步。。「Vue3 企业级项目实战」由程序员十三撰写,2744人购买https://s.ju…...
传导EMI抑制-Π型滤波器设计
1 传导电磁干扰简介 在开关电源中,开关管周期性的通断会产生周期性的电流突变(di/dt)和电压突变(dv/dt),周期性的电流变化和电压变化则会导致电磁干扰的产生。 图1所示为Buck电路的电流变化,在Buck电路中上管电流和下…...
如何在excel中创建斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:…...
遮挡检测--基于角度的遮挡检测方法
文章目录1基于角度的遮挡检测方法2遮挡检测遍历方法2.1方法1--自适应径向扫描方法2.2方法2--螺旋扫描法参考1基于角度的遮挡检测方法 在基于角度的方法中,通过依次分析DSM中沿径向方向的投影光线的角度来识别遮挡。定义α\alphaα角:DSM三维点与相机中心…...
【luogu CF1098D】Eels(结论)
Eels 题目链接:luogu CF1098D 题目大意 有一个可重集,每次操作会放进去一个数或者取出一个数。 然后每次操作完之后,问你对这个集合进行操作,每次选出两个数 a,b 加起来合并回去,直到集合中只剩一个数,要…...
【java】遍历文件夹输出所有文件的文件名与绝对路径,在windows环境
【java】遍历文件夹输出所有文件的文件名与绝对路径,在windows环境 String filepath "D:\\CloudMusic\\";//D盘下的file文件夹的目录File file new File(filepath);//File类型可以是文件也可以是文件夹File[] fileList file.listFiles();//将该目录下的…...
Window问题详解(下)
建议先看一下 Window问题详解(上) 思路② 既然会超时,那该怎么办呢? 显然需要一个更快速的方法来解决这个问题! 我们先来观察一下图片: 我们发现,每一次选中的数都会增加下一个。 !!!!! 因此,我们可以根据此特性优化时间!! 第一次先求出前 k − 1 k-1 k−...
Kafka部署与SpringBoot集成
Kafka与ZooKeeper Apache ZooKeeper是一个基于观察者模式的分布式服务管理框架,即服务注册中心。同时ZooKeeper还具有存储数据的能力。Kafka的每台服务器作为一个broker注册到ZooKeeper,多个broker借助ZooKeeper形成了Kafka集群。同时ZooKeeper会保存一…...
c++11 标准模板(STL)(std::unordered_set)(十三)
定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...
【2023】DevOps、SRE、运维开发面试宝典之ELKStack相关面试题
文章目录 1、elasticsearch的应用场景2、elasticsearch的特点3、Elasticsearch集群三种状态分别是什么?代表什么?4、Elasticsearch集群的优化方面5、Elasticsearch集群防止脑裂的配置参数?6、ELK日志采集平台架构组件介绍?7、Logstash组件的作用?8、收集Kubernetes集群程序…...
Hive中的高阶函数(二)
1、UDTF之explode函数 explode(array)将array列表里的每个元素生成一行; explode(map)将map里的每一对元素作为一行,其中key为一列,value为一列; 一般情况下,explode函数可以直接使用即可,也可以根据需要结…...
Java集合知识点总结
ArrayListLinkedListLinkedHashSetHashSetTreeSetHashTableHashMapTreeMap是否有序有序有序有序无序自然排序(Comparator)进行排序,默认升序使用的是重写comparTo方法无序无序自动排序元素是否为空可为null可为null不允许可为null不允许键允许…...
培训班出身的同学简历怎么做?面试要注意哪些?来自资深大厂HR的忠告
目录 1 不少培训班候选人的简历中,缺乏足够的商业项目年限 2 直接描述培训班学习经历会带来的负面影响 3 大龄转行Vs年轻的初级程序员,公司一般会如何选择? 4 经过培训班突击后,可以先面试小公司 5 面试官怎么面试有培训班经历…...
Hive3.1.3安装部署_最小化部署_元数据MySQL部署_Hiveserver2部署_metastore部署---大数据之Hive工作笔记0012
hbase 实时分析 hive 离线分析 这里是新版本的hive3.1.3的安装 关于hive的原理之前的博客已经详细说了 可以看到上面是hive运行的原理图 词法分析 语法分析...
javascript:void(0) 含义
我们经常会使用到 javascript:void(0) 这样的代码,那么在 JavaScript 中 javascript:void(0) 代表的是什么意思呢?javascript:void(0) 中最关键的是 void 关键字, void 是 JavaScript 中非常重要的关键字,该操作符指定要计算一个表…...
不用机器学习不用大数据,给你讲通ChatGPT的深层原理
ChatGPT现在看来已经异常火爆了,很多人已经熟知,并且开始练习使用或者开始利用他开始实践了。但仍然有很多人在观望,在疑惑,今天狗哥不用那些高端大气的机器学习亦或是大数据还给你讲通ChatGPT深层到底是个啥逻辑。 目录 1. 聊家…...
JavaScript中的循环类型
JavaScript 中有三种主要的循环类型: for、while 和 do...while。 for: 循环指定次数。 例如: for (let i 0; i < 5; i) {console.log(i); } while: 当条件为真时循环。 例如: let i 0; while (i < 5) {console.log(i);i; } do...while: 先执…...
Spring Boot+Vue前后端分离项目练习02之网盘项目利用token进行登陆验证
1.添加依赖 首先需要添加jwt对应的依赖。 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>2.添加配置 JWT由三部分构成,分别是 header, pa…...
springcloud常见面试题(2023最新)
目录前言一.微服务1.微服务是什么?2.你知道哪些RPC框架3.springCloud和Dubbo有什么区别4. SpringCloud由什么组成二.Spring Cloud Eureka1.Eureka包含几个组件2.Eureka的工作原理3.说一下什么是Eureka的自我保护机制4.什么是CAP原则5.都是服务注册中心,E…...
用户态驱动的两种方式-ixy学习
介绍在Linux下有两种启用用户态驱动的子系统:一个是UIO,另一个是VFIO,ixy这两种都支持。 UIO通过虚拟文件系统sysfs下的内存映射文件来暴露所有必要的接口以完成用户态的驱动。这些基于文件的系统调用接口给了我们充足的权限来获取设备资源而…...
机器学习 | 线性回归(单变量)
前文回顾:机器学习概述📚线性回归概念我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是 1250 平方尺大小…...
C++基础知识【3】控制语句
目录 前言 一、条件语句 1.1、if 语句 1.2、if-else 语句 1.3、switch 语句 二、循环语句 2.1、while 循环 2.2、do-while 循环 2.3、for 循环 三、跳转语句 3.1、break语句 3.2、continue语句 3.3、goto语句 四、一些新特性 4.1、if 语句和 switch 语句…...
ImportError: Can not find the shared library: libhdfs3.so解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...
Qt插件开发总结5--主界面嵌入插件UI
文章目录一、前言二、效果展示三、嵌入插件UI1、插件接口文件添加UI指针2、插件子项目工程建立UI类3、插件类中创建UI类、使UI指针指向创建的UI类4、插件元信息中添加widget键值对,指示插件UI嵌入主界面中的位置5、主界面中预留接入点tabWidget6、插件管理器中元数据…...
一些关于linux process 和python process的记录
python mulprocess 主要用来生成另一个进程并运行 def func(i):print(helloworld)from multiprocessing import Process p Process(targetfunc,args(i, )) p.start()如果想要调用shell命令,可以采用os.popen 或者是 subprocess.run 但是前者只能执行命令并获取输…...
卡尔曼滤波——一种基于滤波的时序状态估计方法
文章目录1. Kalman滤波及其应用2. Kalman原理公式推导:Step 1:模型建立Step 2:开始Kalman滤波Step 3:迭代滤波本文是对 How a Kalman filter works, in pictures一文学习笔记,主要是提炼核心知识,方便作者快…...
什么是X6CrMo17-1
X6CrMo17-1X6CrMo17-1是在430的基礎上加入了鉬,提高鋼的耐點蝕、耐縫隙腐蝕性及強度等,比430鋼抗鹽溶液體性強。一、X6CrMo17-1對應牌號:1、國標GB-T標準:數字牌號:S11790、新牌號:10Cr17Mo、舊牌號&#x…...
软件测试是个人就能做?恕我直言,你可能是个“纯粹”的测试工具人,BUG收集器
作为过来人的我和你说说软件测试的真正情况。 前言 一个软件做出来,最不能少的是谁?毫无疑问是开发,开发是最了解软件运作的那个人,早期就有不少一人撸网站或者APP的例子,相当于一个人同时是产品、研发、测试、运维等…...
网站开发简单的框架/关键路径
当我们在进行数据分析时,除了对比现有的数据信息外,还能通过现有的数值计算出其他变量的参数。不过这就需要用到IBM SPSS Statistics中计算变量命令了。今天,我就以一组产品销售的数据为例,向大家演示一下SPSS计算变量的操作方法。…...
建设一个网站app需要多少钱/一个新产品的营销方案
0效果 1来由 首先我有个程序需要用到进度条,我首先试了一下MATLAB自带的进度条: barwaitbar(0,读取数据中...); % waitbar显示进度条 for i1:1000A(i)rand();str[计算中...,num2str(100*i/1000),%]; % 显示的文本waitbar(i/1000,bar,str) …...
网站建设预计费用/长尾词seo排名优化
一.str类型由 "" """ 阔起来的内容就是字符串字符串是不可变的数据类型,无论你执行任何操作,每次操作都会返回一个新的字符串索引从0开始,使用[]可以获取到每一个字符,还可以倒着数(str[])切片str[ : ]顾头不顾尾没有步长只能从左往右切步长为负数可以…...
装潢设计软件免费/seo代码优化工具
一. 前言在使用实践中, fastjson其实确实是简便易用, 但是无奈会有一定的安全漏洞隐患, 为了安全起见, 避免作频繁的 fastjson版本升级, 因此考虑用安全性更佳的jackson来替代全线应用中的fastjson, 其中遇到的问题还相当多, 总结归纳下重点有如下几点:应用场景下时间日期的使用…...
在农村开个网站要多少钱/企业关键词推广
为什么80%的码农都做不了架构师?>>> 方法一: 一般会更新操作都会判断null值,为null就不更新对应的字段。但是有时候需要把特定的字段更新为null,使用mybatis-plus时可以在实体类特定属性上面加注解TableField(strateg…...
把名字设计成logo/重庆做网络优化公司电话
今天来用Node.js做一个小小的爬虫项目 爬虫目标:http://songshuhui.net/(科学松鼠会) 我们需要创建一个文件夹,自己命名就好,然后在文件夹里创建两个文件夹分别命名为data和img,进入到这个总文件夹的目录终…...