Q1:排列字母
题目:
思路:
创建一个数组用来存放26个大写字母,我们为了方便,使数组的index对应的是大写字母的ASCII,我们数组的长度就为91,‘Z’的ASCii码是90;我们统计每个字母出现的次数,最后按顺序从A开始输出即可
代码:
public class Question1 {
public static void main(String[] args) {
String str = "WHERETHEREISAWILLTHEREISAWAY";
int[] nums = new int[91];
for (int i = 0; i < str.length(); i++) {
nums[str.charAt(i)]++;
}
for (int i = 65; i <=90 ; i++) {
for (int j = 1; j <=nums[i] ; j++) {
System.out.print((char)i);
}
}
}
Q2 :GCD
题目:
思路:
明白一个公式:
具体思路放在代码里
import java.util.Scanner;
public class Question2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
long b = sc.nextLong();
long c = b - a;
long k = c - a % c;
System.out.println(k);
/**
* 我们首先要知道更相减损术,gcd(a,b)表示求a,b最大公约数(b>a). gcd(a,b) == gcd(a,b-a);
* 那么我们可以知道gcd(a+k,b+k) == gcd(a+k,b-a);令 c = b - a ;我们根据题目意思就是:
* 求gcd(a+k,c)的最大值,那么我们可以仔细想一下,gcd(a+k,c)肯定是要小于等于(a+k)和c的最小值,我们要让
* Math.min(a+k,c)尽可能的大,c是一个常量,那么a+k必然要比c更大. 那么,gcd(a+k,c)的最大值就是c.
* 要使gcd(a+k,c)==c ;那么(a+k) % c == 0;我们现在要来求这个k,怎么求这个k呢,我们可以这样想,
* 因为(a+k) % c == 0,所以 a % c + k % c == c, k肯定是要小于c的(自己琢磨下)
* 那么a % c + k == c ------>最终: k = c- (a % c);
*/
}
}