首页 > 技术文章 > 百度算法题回忆

qyf2199 2020-03-30 11:48 原文

百度2020日常实习 - Java

@2020.3.29晚上:

(1)题目给出n,求所有(1<=a,b<=n)可能的a与b中:

计算(最小公倍数 - 最大公约数)的最大值:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n=sc.nextLong(); //这里的n用的是【long】,而不是int  //用int通过率30%
        long result=n*(n-1)-1;//【巧妙分析,不用一个个试】
        System.out.print(result);
    }
}

 

(2)给出n个数a[i],每次最大的减去n,其余+1,

直到a[i]中最大的数小于n为止,统计“减n”操作的次数:k

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        long[] a=new long[n+1];//因为a[i]属于1~10^18,所以用long,而不是int

        for(int i=0;i<n;i++){
            a[i]=sc.nextLong();//nextLong()
        }
        long k=0;
        while(true){
            long max=0;
            int index=0;
            for(int i=0;i<n;++i){
                if(max<a[i]){
                    max=a[i];
                    index=i;
                }
            }
            if(max<n)break;
            long temp=(a[index]-n)/n; //注意temp的类型
            if(temp<1)temp=1;
            a[index]=a[index]-n*temp;//【一次减去temp次的n,不然时间复杂度爆表】 //在这个修改之前,一直显示系统超时————“循环错误或者复杂度过高”
            for(int i=0;i<n;++i){
                if(i!=index)a[i]+=temp;//
            }
            k+=temp;
        }
        System.out.print(k);//【我们只需要次数k,不用完全模拟过程,要加速中间的步骤】
    }
}

 

笔试当天上午的:输入输出格式练习,起到了很大的作用&启发:https://www.cnblogs.com/qyf2199/p/12590097.html

推荐阅读