每日一道算法题(2024-1-26)-计算k置位下标对应元素的和

计算k置位下标对应元素的和

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

请你用整数形式返回 nums 中的特定元素之  ,这些特定元素满足:其对应下标的二进制表示中恰存在 k 个置位。

整数的二进制表示中的 1 就是这个整数的 置位 。

例如,21 的二进制表示为 10101 ,其中有 3 个置位。

示例 1:

输入:nums = [5,10,1,5,2], k = 1
输出:13
解释:下标的二进制表示是: 
0 = 0002
1 = 0012
2 = 0102
3 = 0112
4 = 1002 
下标 1、2 和 4 在其二进制表示中都存在 k = 1 个置位。
因此,答案为 nums[1] + nums[2] + nums[4] = 13 。

示例 2:

输入:nums = [4,3,2,1], k = 2
输出:1
解释:下标的二进制表示是: 
0 = 002
1 = 012
2 = 102
3 = 112
只有下标 3 的二进制表示中存在 k = 2 个置位。
因此,答案为 nums[3] = 1 。
package com.test4;

import java.util.ArrayList;
import java.util.List;

public class GenericMethodTest {

    /*public static void main(String[] args) {
        Integer[] intArray = {1,2,3,4,5};
        Double[] doubleArray={1.1,1.2,1.3};
        Character[] charArray={'H','E','L','L','O'};

        System.out.println("整数数组元素为");
        printArray(intArray);

        printArray(doubleArray);
        printArray(charArray);

    }
    public static <E> void printArray(E[] inputArray){
     for(E element:inputArray){
         System.out.println(element);*/

   /* public static void main(String[] args) {

    }
public static <T extends Comparable<T>> T maximum(T x,T y,T z){
        T max = x;

*/


    public static void main(String[] args) {
       /* for(int i =0;i<4;i++){

            String s = Integer.toBinaryString(i);
            System.out.println(s);

            System.out.print(i);*/
 /*   String s = Integer.toBinaryString();
    System.out.println(s);*/



GenericMethodTest g = new GenericMethodTest();
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(5);
        nums.add(10);
        nums.add(1);
        nums.add(5);
        nums.add(2);
        System.out.println(nums);
int result=g.sumIndicesWithKSetBits(nums,1);
        System.out.println("result ="+result);
//        System.out.println(result);


    }

    public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
        int length = nums.size();
//        System.out.println(length);


        int sum = 0;
        String[] str = new String[length];
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < length; i++) {
            String binary = Integer.toBinaryString(i);

            str[i] = binary;
//            System.out.println(str[i]);

int count = 0;
            for(int j =0;j<str[i].length();j++){

                List<Character> characters = new ArrayList<>();
                characters.add(str[i].charAt(j));


                    for(char c :characters){
                        System.out.print(" ");
                        System.out.print("二进制分解为="+c);
                        if(c=='1'){
                            count++;
                        }
                    }
                System.out.print(" ");



            }
            System.out.println("置数的总数="+count);
            if(count == k){
               sum +=nums.get(i);
                System.out.println(sum);
            }



//                System.out.println( str[i]);
           }

        return sum;
        }






}





官方解法:利用十进制转二进制的思路,二进制只有0和1,方便计数

package com.test4;

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static void main(String[] args) {

        List<Integer> nums = new ArrayList<Integer>();
        nums.add(5);
        nums.add(10);
        nums.add(1);
        nums.add(5);
        nums.add(2);
        Solution s = new Solution();

        System.out.println(nums);
        System.out.println(s.sumIndicesWithKSetBits(nums,1));
    }

    public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int ans = 0;
for(int i =0;i<nums.size();i++){

    if(bitCount(i) == k){
        ans+=nums.get(i);

    }


}


        return ans;

    }

    //计算列表中每个数1出现的个数,二进制为十进制取模,余数再除以2取模,当为1时候正好计算总出现个数
int bitCount(int x){
        int cnt = 0;
        while(x != 0){
            cnt += (x%2);
            x/=2;


        }
return cnt;

}



}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值