day05-191/976/1281

267 阅读1分钟

第一题

题目

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量

思路

因为对位运算不熟悉,所以最开始!我的思路是转字符串,然后遍历匹配,啧! 后来看了题解,位运算一下就出来了呀!直接循环检查给定整数 n 的二进制位的每一位是否为 1

左移:所有位向左挪一位,右补0

image.png

代码

    public int hammingWeight(int n) {
        int ret = 0;
        for (int i = 0; i < 32; i++) {
            if ((n & (1 << i)) != 0) {
                ret++;
            }
        }
        return ret;
    }

第二题

题目

给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差

思路

第一个思路,转字符串后,按位截取,然后再转回来,废弃,不太好。

第二个思路,就对10n次方不断取余,求最终结果,不要忘记,对余数也要除10n-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;
    }