刷题(十六)查找输入整数二进制中1的个数 手套

博客探讨了如何计算输入整数在二进制表示下的1的个数,并提供了Java解决方案。此外,还讨论了一个关于手套选择的问题,其中贪心算法用于确定最少需要拿多少只手套来确保找到一对颜色相同的手套。
摘要由CSDN通过智能技术生成

查找输入整数二进制中1的个数 手套

查找输入整数二进制中1的个数

题目描述:输入一个正整数,计算它在二进制下的1的个数。
注意多组输入输出!!!!!!
输入描述:输入一个整数。
输出描述:计算整数二进制中1的个数
示例
输入:5
输出:2
链接查找输入整数二进制中1的个数

思路

通过(n>>i)&1可以获得第i位二进制值,n右移一次可以获取一位的二进制值,n变为0循环终止。

代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        while(s.hasNext()) {
            int n=s.nextInt();
            int count=0;
            while(n!=0) {
                if((n&1)==1) {
                    count++;
                }
                n>>=1;
            }
            System.out.println(count);
        }
    }
}

手套

题目描述
在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。
给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一种合法方案。
示例
输入:4,[0,7,1,6],[1,5,0,6]
输出:10(左手手套取2只,右手手套取8只)
链接手套

思路

看到题我们最先想到的思路是,可以把全部的左手套拿出,再拿出一只右手套,或者把所有的右手套拿出,再拿出一只左手套。但是题目要求最少,这就体现了一种贪心思想:每次局部最优,最后全局最优。思路就是首先取出左手套或者右手套,使拿起的数目覆盖全部颜色,然后相应的另一半手套只需要挑出一只即可。特别要注意手套为0的情况,因为一旦某个颜色手套数目为0,将导致该颜色的手套是不可能匹配的,所有这种情况下要把0对应的手套取出。

代码

import java.util.*;

public class Gloves {
    public int findMinimum(int n, int[] left, int[] right) {
        // write code here
        int leftsum=0;
        int rightsum=0;
        int leftmin=Integer.MAX_VALUE;
        int rightmin=Integer.MAX_VALUE;
        int sum=0;
        for(int i=0;i<n;i++) {
            if(left[i]*right[i]==0) {
                sum+=left[i]+right[i];
            } else {
                if(left[i]<leftmin) {
                    leftmin=left[i];
                }
                leftsum+=left[i];
                if(right[i]<rightmin) {
                    rightmin=right[i];
                }
                rightsum+=right[i];
            }
        }
        sum=sum+Math.min(leftsum-leftmin+1,rightsum-rightmin+1)+1;
        return sum;
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值