java—如果可以将列表拆分为较小的列表,并且在拆分的列表中至少有两个值,则返回true,否则返回false

zbq4xfa0  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(275)

在一副牌中,每张牌上都写着一个整数。
当且仅当可以将整个牌组拆分为一组或多组牌时返回true,其中:
每组至少有2张牌。每组的牌都有相同的整数。
例子:
输入:甲板= [1,2,3,4,4,3,2,1] 输出:真
说明:可能的分区 [1,1],[2,2],[3,3],[4,4] .
我试图解决这个使用堆栈,但它不是预期的工作,它是打印假,而它应该打印真。为了代码的清晰,我添加了注解。
Package 实践kg;

import java.util.Stack;

public class DeckInteger {

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<Integer>();
        //declaring individual variable for each integer and setting all of them to zero
        int p_1=0,p_2=0,p_3=0,p_4=0,p_5=0,p_6=0,p_7=0,p_8=0,p_9=0;

        //adding element which can form pair and should return true
        stack.add(1);
        stack.add(2);
        stack.add(1);
        stack.add(2);
        stack.add(1);
        stack.add(2);

        //checking till stack is empty and comparing the top of stack to all the individual integer and incrementing them and popping the top element 
        while(stack.empty()==false) {
            if(stack.peek()==1) {
                p_1+=1;
                stack.pop();                        
                break;
            } else if(stack.peek()==2) {
                p_2+=1;
                stack.pop();                        
                break;
            } else if(stack.peek()==3) {
                stack.pop();
                p_3+=1;
                break;
            } else if(stack.peek()==4) {
                stack.pop();
                p_4+=1;
                break;
            } else if(stack.peek()==5) {
                stack.pop();
                p_5+=1;
                break;
            } else if(stack.peek()==6) {
                stack.pop();
                p_6+=1;
                break;
            } else if(stack.peek()==7) {
                stack.pop();
                p_7+=1;
                break;
            } else if(stack.peek()==8) {
                stack.pop();
                p_8+=1;
                break;
            } else {
                stack.pop();
                p_9+=1;
                break;
            }
        }
        //checking if any of the integer variable have the value 1 then it cannot form pair as x>=2 so it should print false
        if(p_1==1||p_2==1||p_3==1||p_4==1||p_5==1||p_6==1||p_7==1||p_8==1||p_9==1) {
            System.out.println("False");
        }
        //print true as if any of the variable have a value other than one
        else {
            System.out.println("True");
        }
    }    
}
5uzkadbs

5uzkadbs1#

如果你有 a_i 带整数的卡片 i ,则所有可能的分区都是 a_i ,否则,此卡不能拆分。因此,您只需要计算所有的唯一数,并计算它们的最大公约数。这个最大公约数就是可能的最大x。

wljmcqd8

wljmcqd82#

在您使用的代码中 break 每个内部 if 条件。所以它会从 while 在第一次迭代本身中循环。仅此而已 p_1 等于 1 其他人都会 0 . 有一个更好的方法来解决这个问题 Maps 键作为整数,值作为计数
假设输入为数组: int[] input ```
private boolean isValidGroup(Stack stack){
Map<Integer, Integer> countMap = new HashMap<>();
while(!stack.empty()){
countMap.merge(stack.pop(),1,Integer::sum);
}
// The above map would contain the count for each integer.
// For input : {1,2,4,2,4,3,1,3} , the map would be {1:2,2:2,3:2,4:2}

List<Integer> distinctCounts = countMap.values().stream().distinct().collect(Collectors.toList());
// The above list contains the distinct group counts.

// Ideally the number of distinct count value should be 1 and the value should be >=2.
//In such case, we return true.
return (distinctCounts.size()==1 && distinctCounts.get(0)>=2);

}

相关问题