第一题
题目
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)
思路
因为对位运算不熟悉,所以最开始!我的思路是转字符串,然后遍历匹配,啧! 后来看了题解,位运算一下就出来了呀!直接循环检查给定整数 n 的二进制位的每一位是否为 1
左移:所有位向左挪一位,右补0
代码
public int hammingWeight(int n) {
int ret = 0;
for (int i = 0; i < 32; i++) {
if ((n & (1 << i)) != 0) {
ret++;
}
}
return ret;
}
第二题
题目
给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差
思路
第一个思路,转字符串后,按位截取,然后再转回来,废弃,不太好。
第二个思路,就对10的n次方不断取余,求最终结果,不要忘记,对余数也要除10的n-1次方
代码
public int subtractProductAndSum(int n) {
int res1 = 1;
int res2 = 0;
int i = 10;
if(n<10) return 0;
while((n * 10)/i!=0) {
res1= res1 * ((n%i)/(i/10));
res2+=(n%i)/(i/10);
i=i*10;
}
return res1 - res2;
}
第三题
题目
给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0
思路
排序,然后从后遍历,只要相邻的三个数能够组成三角形,这就是最大的,否则不断向前走(不用考虑隔一个数的情况,相邻的不能组成三角形,隔一个数更不可能了)
代码
public int largestPerimeter(int[] nums) {
Arrays.sort(nums);
int res = 0;
for(int i = nums.length - 3; i >= 0 ; i--) {
if(nums[i] + nums[i+1] > nums[i+2]) {
res = nums[i]+nums[i+1]+nums[i+2];
break;
}
}
return res;
}