猜近似数字 Java版

520 钻石争霸赛 猜近似数字

https://pintia.cn/problem-sets/1259839299727368192/problems/1259850789826048002

题目描述

甲想好了一个 n 位数字让乙来猜,只要猜的数字位数正确,至多有 1 位与谜底不同,且不同的数字相差不超过 1,就算猜对了。例如谜底是 67,若乙猜 66、68、77、57,就都算对了;猜 167 就不能算对。

输入格式:
输入首先在第一行给出一个不超过 1000 位数的、最高位不是 0 的正整数,是甲给出的谜底。随后若干行,每行给出一个乙猜的数字,都是最高位不是 0 的正整数。直到出现 -1 表示输入结束,这个数字不要做任何处理。题目保证乙至少猜了一次。

输出格式:
对每一个乙猜的数字,如果猜对了就输出Yes,否则输出 No

输入样例:

12345678909876
2345678909876
12345678900876
12345678809876
12345678909888
1234567890987
-1

输出样例:

No
No
Yes
No
No

我的理解

| Understand

  1. 本题目说不上难,只是对相应的问题需要进行逻辑处理。细心就好。
  2. 本题数字很大,难以用一个整形表示,故此我选用Java字符串处理。

| Devise

  1. 总体思想:把对数字的操作变化成对字符串的单个字符操作。
  2. 对关键的数字0和9加以注意,其他数字常规处理。

| Carry out

  1. switch语句比全部if-else分支增强了可读性。

| Look back

  1. 只有经常性的练习才能达到轻车熟路的程度。

Java Code

import java.util.Scanner;

class Main {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        String a;
        a = sc.nextLine();
        String temp1 = sc.nextLine();
        boolean isError = false;
        while(temp1.compareTo("-1")!=0)//不是结尾
        {
            int sum = 0;//最多只允许有一次改变的机会
            if(temp1.length() != a.length())//首先进行长度比较,不知为何用continue语句在提交之后有bug.
            {
                isError=true;
            }
            else
            {
            	//逐位取出做对比
                for(int i = 0;i < a.length();++i)
                {
                    int num1 = Integer.parseInt(String.valueOf(a.charAt(i)));//Java的String.charAt()用法王为老师讲过、也经常用。不过我平时比较喜欢C++.
                    int num2 = Integer.parseInt(String.valueOf(temp1.charAt(i)));
                    switch(num1)
                    {
                        case 0:
                            if(num2 == 1)
                                sum += 1;//不超过2则正确
                            else
                            {
                                if(num2 != 0) //既不是0又不是1
                                {
                                    isError = true;
                                }
                            }
                            break;
                        case 9:
                            if(num2 == 8)
                                sum+=1;
                            else
                            {
                                if(num2 != 9)//既不是9也不是8
                                {
                                    isError = true;
                                }
                            }
                            break;
                        default:
                            if(num1 != num2)//相等不做任何处理
                            {
                                if(num1 == num2+1 || num1 == num2-1)
                                    sum += 1;
                                else
                                {
                                    isError = true;
                                }
                            }
                            break;
                    }
                }
            }
            if(isError == true)
                System.out.println("No");
            else
            {
                if(sum <= 1)
                    System.out.println("Yes");
                else {
                    System.out.println("No");
                }
            }
            temp1 = sc.nextLine();
            isError = false;
        }
        sc.close();//关闭是良好的习惯。

    }
}

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读