猜密码:
3 6 2 8 其中一个数字正确且位置正确
7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对
1 4 2 9 一个数字正确,位置不对
4 5 7 6 一个数字正确且位置正确
以上条件成立,且四位密码数字不重复,实用java程序实现。
有点类似力扣里的猜数字问题,这个问题仅用java基础进行编写(数组或者字符串,哈希和list不能用),大概都是暴力穷举,希望网友们多多参与讨论。
如何用java猜四位数密码?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
9条回答 默认 最新
- zlebhs 2022-06-21 14:04关注
只用了些基础的方式,算法很简单,只要计算一下位置正确且数字正确的个数和数字正确的个数,然后和你给的条件暴力枚举即可
public static void main(String[] args) { // 枚举法 out: 0518 3510 String str1 = "3628"; String str2 = "7019"; String str3 = "1429"; String str4 = "4576"; for (int i = 0; i <= 9999; i++) { // 补0 String cur = String.format("%04d", i); if (!check(cur, str1, 1, 1)) continue; if (!check(cur, str2, 1, 2)) continue; if (!check(cur, str3, 0, 1)) continue; if (!check(cur, str4, 1, 1)) continue; System.out.println("密码:" + cur); } } public static boolean check(String target, String condition, int targetPos, int targetSame) { int[] cnt1 = new int[10]; int[] cnt2 = new int[10]; // 位置正确且数字正确个数 int posCnt = 0; for (int i = 0; i < 4; i++) { char c1 = target.charAt(i); char c2 = condition.charAt(i); cnt1[c1 - '0']++; cnt2[c2 - '0']++; // 重复数字直接返回false if (cnt1[c1 - '0'] > 1) return false; if (c1 == c2) posCnt ++; } // 数字正确个数 int sameCnt = 0; for (int i = 0; i < 10; i++) { sameCnt += Math.min(cnt1[i], cnt2[i]); } return posCnt == targetPos && sameCnt == targetSame; }
输出
密码:0518 密码:3510
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 平板录音机录音问题解决
- ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
- ¥15 (SQL语句|查询结果翻了4倍)
- ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
- ¥50 .net core 并发调用接口问题
- ¥15 网上各种方法试过了,pip还是无法使用
- ¥15 用verilog实现tanh函数和softplus函数
- ¥15 Hadoop集群部署启动Hadoop时碰到问题
- ¥15 求京东批量付款能替代天诚
- ¥15 slaris 系统断电后,重新开机后一直自动重启