算法训练#12:思维题之DCMA和Spy_Detected

26 阅读3分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

第一题

DCMA

内容理解

求一个数的数位和,再若其大于十,再求一个数的数位和,求到该数位和小于十为止,然后输出

输入

案例的第一行输入整数aa、,其中1a1061\le a\le10^{6}

输出

输出对应的整数

思路

诚然,按照我对题目的理解去求没什么问题,也可以过,我当时做完也没有去理会了,但当我在力扣看到258. 各位相加时,我的记忆又被唤醒了,于是我打开“题解”栏,看到了官方题解的第二条,我大呼震撼,感觉到了数学的神奇。这种方法代码很简单,但关键是要找到数字根(我们题目要求的答案正是基于此)的规律:一个数的数字根就是该数求余9的答案。我们只需要在此基础上,对0和9的倍数的情况(力扣那道有对0的判断,但是这里取值范围没有0)进行判断就可以了

代码

import java.util.Scanner;

public class DMCA {
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int x=sc.nextInt();
        System.out.println(x%9==0?9:x%9);
    }
}

第二题

Spy Detected!

内容理解

给出一个长度为nn的正整数数组(n3n\le 3),找出那个与数组其他数不相同的数并输出其下标

输入

第一行输入整数tt表示案例的个数、,其中1t1021\le t\le10^{2} 案例的第一行输入整数nn、,其中3n1023\le n\le10^{2} 案例的第二行输入nn个整数代表数组元素,其中1每一个数组元素1021\le 每一个数组元素\le10^{2} 本题的输入全部符合要求,没有错误情况判断

输出

输出一个整数——表示那个与众不同的数的下标

思路

这道题很简单,但是我觉得在训练简单思维题的时候不能只满足于解出题目,还要提供不同的思路出来才可以。那么这里我提供两个思路:一个是一次循环遍历,第一个数跟后两个比较,中间的数跟旁边两个比较,最后一个跟它的前面两个比较,用于比较的三个数中若有一个与其他两个不相等,那么它就是我们要找的数;还有一种思路是先把数组排序,那么我们要找的数要么在第一个,要么在最后一个,把这个数找出来,然后再在原来的数组中遍历,直接找到它的下标即可。

代码

import java.util.Arrays;
import java.util.Scanner;

public class Spy_Detected {
//这里提供第二种思路的代码
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            int n=sc.nextInt();
            int[] x=new int[n];
            int[] y=new int[n];
            for(int j=0;j<n;j++){
                x[j]=sc.nextInt();
                y[j]=x[j];
            }   
            Arrays.sort(y);
            int index=0;
            if(y[0]!=y[1])
                index=y[0];
            else
                index=y[n-1];
            for(int j=0;j<n;j++)
            {
                if(x[j]==index)
                {
                    System.out.println(j+1);
                    break;
                }
            }
        }
    }
}