【Java猜数字】

Java实现猜密码:

猜密码:
3 6 2 8 其中一个数字正确且位置正确;
7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对;
1 4 2 9 一个数字正确,位置不对;
4 5 7 6 一个数字正确且位置正确
以上条件成立,且四位密码数字不重复,实用java程序实现。
有点类似力扣里的猜数字问题,这个问题仅用java基础进行编写(数组或者字符串,哈希和list不能用)

解题思路:

  • 数字比对的方法
  • 如果数字对了,位置不对 则显示 nB,n是有几个是位置对的。
  • 如果数字对了,位置也是对的 则显示mA,m代表有几个数字是正确位置上的。
  • 3 6 2 8 其中一个数字正确且位置正确. 1A0B
  • 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B
  • 1 4 2 9 一个数字正确,位置不对. 0A1B
  • 4 5 7 6 一个数字正确且位置正确 1A0B
  • 1A0B + 1A1B + 0A1B + 1A0B = 3A2B
  • 当结果输出3A2B时表示密码匹配正确

运行结果

答案为0518, 3510
在这里插入图片描述

代码实现

import java.util.Objects;
public class GuessPasswordTest {
  /**
   * 猜密码: <br>
   * 3 6 2 8 其中一个数字正确且位置正确.<br>
   * 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. <br>
   * 1 4 2 9 一个数字正确,位置不对. <br>
   * 4 5 7 6 一个数字正确且位置正确 以上条件成立,且四位密码数字不重复,实用java程序实现。<br>
   * 有点类似力扣里的猜数字问题,这个问题仅用java基础进行编写(数组或者字符串,哈希和list不能用)
   */
  public static void main(String[] args) {
    guessPassword();
  }

  public static int[] guessPassword() {
    int[] arr = new int[4];
    String pwd = "";
    // 0-9中 4位不重复的数字组合排列
    for (int i = 1; i < 10000; i++) {
      pwd = String.format("%04d", i);
      String sub1 = pwd.substring(0, 1);
      String sub2 = pwd.substring(1, 2);
      String sub3 = pwd.substring(2, 3);
      String sub4 = pwd.substring(3, 4);
      if (!Objects.equals(sub1, sub2)
          && !Objects.equals(sub1, sub3)
          && !Objects.equals(sub1, sub4)
          && !Objects.equals(sub2, sub3)
          && !Objects.equals(sub2, sub4)
          && !Objects.equals(sub3, sub4)) {
        arr[0] = Integer.parseInt(sub1);
        arr[1] = Integer.parseInt(sub2);
        arr[2] = Integer.parseInt(sub3);
        arr[3] = Integer.parseInt(sub4);
        // 与已知密码匹配,当匹配度为3A2B时输出密码
        String compare = compare(arr);
        if ("3A2B".equals(compare)) {
          System.out.println("pwd: " + pwd);
          System.out.println("compare: " + compare);
         // break;
        }
      }
    }
    return arr;
  }

  /**
   * answer1输出为 1A0B <br>
   * answer2输出为 1A1B <br>
   * answer3输出为 0A1B <br>
   * answer4输出为 1A0B <br>
   *
   * @param inputs 输入密码
   * @param answer 匹配四种答案
   * @return 匹配成功
   */
  public static String compare(int[] inputs, int[] answer) {
    int aA = 0;
    int bB = 0;
    for (int i = 0; i < answer.length; i++) {
      for (int j = 0; j < inputs.length; j++) {
        if (inputs[j] == answer[i] && i == j) {
          aA += 1;
        } else if (inputs[j] == answer[i] && i != j) {
          bB += 1;
        }
      }
    }
    return "" + aA + "A" + bB + "B";
  }

  /**
   * 数字比对的方法 <br>
   * 如果数字对了,位置不对 则显示 nB,n是有几个是位置对的。<br>
   * 如果数字对了,位置也是对的 则显示mA,m代表有几个数字是正确位置上的。<br>
   * 3 6 2 8 其中一个数字正确且位置正确. 1A0B <br>
   * 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B <br>
   * 1 4 2 9 一个数字正确,位置不对. 0A1B <br>
   * 4 5 7 6 一个数字正确且位置正确 1A0B <br>
   * 1A0B + 1A1B + 0A1B + 1A0B = 3A2B<br>
   * 当结果输出3A2B时表示密码匹配正确
   *
   * @return 3A2B
   */
  public static String compare(int[] inputs) {
    /**
     * 如果数字对了,位置不对 则显示 nB,n是有几个是位置对的。<br>
     * 如果数字对了,位置也是对的 则显示mA,m代表有几个数字是正确位置上的。
     */
    int mA = 0;
    int nB = 0;
    String str = "";

    // 3 6 2 8 其中一个数字正确且位置正确. 1A0B , 0518
    int[] answer1 = {3, 6, 2, 8};
    // 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B
    int[] answer2 = {7, 0, 1, 9};
    // 1 4 2 9 一个数字正确,位置不对. 0A1B
    int[] answer3 = {1, 4, 2, 9};
    // 4 5 7 6 一个数字正确且位置正确 1A0B
    int[] answer4 = {4, 5, 7, 6};

    // 1A0B
    // 3 6 2 8 其中一个数字正确且位置正确. 1A0B ,
    String str1 = compare(inputs, answer1);

    if ("1A0B".equals(str1)) {
      mA += 1;
      // 1A1B
      // 7 0 1 9 其中两个数字正确,一个位置正确,一个位置不对. 1A1B
      String str2 = compare(inputs, answer2);
      if ("1A1B".equals(str2)) {
        mA += 1;
        nB += 1;
        // 0A1B
        // 1 4 2 9 一个数字正确,位置不对. 0A1B
        String str3 = compare(inputs, answer3);
        if ("0A1B".equals(str3)) {
          nB += 1;
          // 1A0B
          // 4 5 7 6 一个数字正确且位置正确 1A0B
          String str4 = compare(inputs, answer4);
          if ("1A0B".equals(str4)) {
            mA += 1;
          }
        }
      }
    }
    str = "" + mA + "A" + nB + "B";
    return str;
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值