以下为本人在刷题时的笔记,思路及要点仅作为参考,不作为标准的答案。不足之处,欢迎在评论区批评指正~
【第一部分:题库】
1、勾股数元组
1. 判断质数
boolean数组默认true → 0和1不是 → 从i=2开始,对i的倍数从i倍开始,置为false
public static boolean isPrimer(int n) {
boolean[] countPrime = new boolean[n+1];
Arrays.fill(countPrime, true);//1. 先默认都是质数
countPrime[0] = false; countPrime[1] = false;//2. 0-1不是质数
//3. 如果x是质数,那么2x, 3x, 4x...不是质数
/*后面的数都默认是质数,从2,3,5,7...开始依次将它们的倍数排除,总能将所有数字遍历过一遍*/
for(int i = 2; i <= n; i++) {
if(countPrime[i] && i*i <= n) {
for(int j = i*i; j <= n; j +=i) {
//i的倍数所以每次j+i
countPrime[j] = false;
}
}
}
return countPrime[n];
}//isPrimer
2. 两数互质
概念:公因数只有1
判断方法:1)两个质数互质;2)1与任何数互质;3)a的所有质因子与b的所有质因子互质。
public static boolean isHuzhi(int a, int b) {
//是否互质
if(isPrimer(a) && isPrimer(b)) {
//两个质数互质
return true;
}else if(a == 1 && b == 1) {
//1与任何数互质
return true;
}else{
//如果没有相同的质因子,则互质
Set<Integer> set1 = new HashSet<Integer>(), set2 = new HashSet<Integer>();
set1 = getZhiList(a); set2 = getZhiList(b);
int count = 0;//相同质因子的个数
for(Integer num : set1) {
if(set2.contains(num)) count++;
}
if(count == 0) return true;
}//if-else
return false;
}//isHuzhi
public static Set<Integer> getZhiList(int n){
//Set内的元素不重复
/*因为只需要判断是否有相同的质因子,某个质因子的数量无关,所以可以用Set*/
Set<Integer> set = new HashSet<Integer>();
int i = 2;
while(i <= n) {
if(isPrimer(i) && (n % i == 0)) {
//是质数,且能整除,那就是质因子
n = n / i;
set.add(i);
if(n == 1) break;//已经除到1了
i = 2;//i又重新从2开始算
}else {
i++;
}
}//while
return set;
}//getZhiList
2、数组
如果只需要在一个方向上操作数组,且每次只需要判断第一个数,则用Queue。但这题不是,所以不能用Queue,数组判断边界很重要。
3、遍历矩阵
4、TLV????
认真读题。
1. 小端序
01 00 为 00 01
02 00 为 00 02
03 00 为 00 03
5、猴子爬台阶——1、k步——动态规划
走台阶的dp[]是一维的
- dp[i]的含义:从开始到第i个台阶一共有几种走法
- 递推:dp[i][j] = dp[i-1][j] + dp[i-3][j]
- 初始化:0<n<=50;i = 0表示还没上台阶;i < k时,dp[i] = 1;dp[k] = 2;所以for循环从i=k+1开始。
- 遍历顺序:左右,上下
- 递推一遍公式 。思路就是这样,注意检查边界条件。
6、GPU的并行度
注意检查边界。
7、按差值的绝对值排序
分析好题目即可。
8、字符串句子反转
去掉首位空格。
str = str.trim();
9、购物——动态规划
- String[] 转 int[]——lambda表达式
String[] str_arr = sc.next

418

被折叠的 条评论
为什么被折叠?



