华为机试 | 笔记

以下为本人在刷题时的笔记,思路及要点仅作为参考,不作为标准的答案。不足之处,欢迎在评论区批评指正~

【第一部分:题库】

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[]是一维的

  1. dp[i]的含义:从开始到第i个台阶一共有几种走法
  2. 递推:dp[i][j] = dp[i-1][j] + dp[i-3][j]
  3. 初始化:0<n<=50;i = 0表示还没上台阶;i < k时,dp[i] = 1;dp[k] = 2;所以for循环从i=k+1开始。
  4. 遍历顺序:左右,上下
  5. 递推一遍公式 。思路就是这样,注意检查边界条件

6、GPU的并行度

注意检查边界。

7、按差值的绝对值排序

分析好题目即可。

8、字符串句子反转

去掉首位空格。

str = str.trim();

9、购物——动态规划

  1. String[] 转 int[]——lambda表达式
String[] str_arr = sc.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值