首页 > 其他分享 >【字节青训营-二分数字组合(简)】

【字节青训营-二分数字组合(简)】

时间:2024-11-03 16:19:42浏览次数:4  
标签:二分 字节 int System solution 青训营 println array out

二分数字组合

问题描述

小F面临一个有趣的挑战:给定一个数组,她需要将数组中的数字分为两组。分组的目标是使得一组数字的和的个位数等于给定的 A,另一组数字的和的个位数等于给定的 B。除此之外,还有一种特殊情况允许其中一组为空,但剩余数字和的个位数必须等于 A 或 B。小F需要计算所有可能的划分方式。

例如,对于数组 [1, 1, 1] 和目标 A = 1,B = 2,可行的划分包括三种:每个 1 单独作为一组,其余两个 1 形成另一组。如果 A = 3,B = 5,当所有数字加和的个位数为 3 或 5 时,可以有一组为非空,另一组为空。


测试样例

样例1:

输入:n = 3,A = 1,B = 2,array_a = [1, 1, 1]

输出:3

样例2:

输入:n = 3,A = 3,B = 5,array_a = [1, 1, 1]

输出:1

样例3:

输入:n = 2,A = 1,B = 1,array_a = [1, 1]

输出:2

样例4:

输入:n = 5,A = 3,B = 7,array_a = [2, 3, 5, 7, 9]

输出:0

public class Main {
    public static int solution(int n, int A, int B, int[] array) {
        // Please write your code here
        //使用一个位运算解决该问题
        int allSum = 0;
        
        for(int i = 0; i < array.length; i++){
            allSum = allSum + array[i];
        }

        //进行子集的遍历
        int count = 0;
        for(int i = 0; i < (int)Math.pow(2,array.length); i++){
            int sum = 0;
            
            for(int j = 0; j < array.length; j++){
                if((i & (1<<j)) != 0){
                    sum = sum + array[j];
                }
            }
            if(
                ((allSum - sum) % 10 == A && sum % 10 == B) || 
                ((allSum - sum) % 10 == A && sum  == 0) ||
                ((allSum - sum) % 10 == B && sum  == 0)
            ){
                count ++;
            }
        }
        // for(List<Integer> k : list){
        //     System.out.println(k);
        // }
        System.out.println(count);
        return count;
    }

    public static void main(String[] args) {
        //  You can add more test cases here
        int[] array1 = {1, 1, 1};
        int[] array2 = {1, 1, 1};
        int[] array3 = {1, 1};
        int[] array4 = {17,5,6,8,1,7,5,14};

        System.out.println(solution(3, 1, 2, array1) == 3);
	      System.out.println(solution(3, 3, 5, array2) == 1);
        System.out.println(solution(2, 1, 1, array3) == 2);
        System.out.println(solution(8, 6, 3, array4) == 1);
    }
}

遇到的问题: 判断条件错误,条件判断将所有的可能出现的情况进行了枚举,造成重复,类似于:A = 4, B = 3进行了count + 1,然后A= 3 ,B = 4 也进行了count + 1;

标签:二分,字节,int,System,solution,青训营,println,array,out
From: https://blog.csdn.net/yf3241610146/article/details/143464970

相关文章

  • 【LeetCode:153. 寻找旋转排序数组中的最小值 + 二分】
    在这里插入代码片......
  • 字节青训-寻找最大葫芦
    问题描述在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。在这个问题中,我们对“......
  • c语言:一维数组+二维数组+二分查找法
     1:数组的概念     概念:数组是一组相同元素的集合。     特点:1、数组中存放的是一个或者多个数据,但是数组的元素个数不可以为0.3          2、数组里存放的数据是同类型的数据     分类:数组分为一维数组和多维数组,其中多......
  • ——二分查找——
    注意:代码中的left、right、mid都是下标,只有val代表的是值,区别好,才能更好理解代码。一、代码实现deffun(li,val):left=0#下标第一个right=len(li)-1#下标最后一个whileleft<=right:#查找范围,左......
  • 二分法:高效查找的数学利器
    二分法:高效查找的数学利器二分法,又称为二分查找,是一种在已排序数组中查找特定元素的高效算法。其基本思想是通过每次将查找范围减半来迅速定位目标值。以下将详细介绍二分法的原理、实现步骤及其应用场景。一、基本原理二分法的工作原理如下:初始设置:设定两个指针,left指......
  • 整数二分 ——洛谷p9240冶炼金属
    #include<bits/stdc++.h>#defineendl'\n'#defineINF0x3f3f3f3f#defineintlonglongusingnamespacestd;constintN=1e4+10;inta[N],b[N];intn;//找左节点boolcheck_min(intmid){ for(inti=0;i<n;i++) { if(b[i]<a[i]/mid) return......
  • 【面试经验】字节tictok三面
    上午面的,今天很忙啊,没来得及分享。面试官人在美国,我看了一下,面试时间是UTC-5的20:00-21:00这些。上来双方自我介绍,面试官的履历很牛,非常牛,字节是他待过最小的公司了可能。然后就直接开coding。1.中序遍历;2.岛屿数量。题不难,我是个算法菜鸡,岛屿不会,应该是凉透了。后面......
  • arc186a 二分图 建模
    先直接给出思路,把这个矩阵建成一个完全二分图,如果\(a_{i,j}=1\)的话从左边的i连向右边的j,否则从右边的j连向左边的i,此时左边\(i\)的出度表示第\(i\)行的\(1\)的个数,右边\(j\)的出度表示第\(j\)列1的个数。我们发现,如果图中存在一个环,那么将环上的边全部翻转所有点的度数依然不变,但......