Java 递归函数提升二进制数组

Java 递归函数提升二进制数组,java,arrays,function,recursion,Java,Arrays,Function,Recursion,如何使用递归函数提升二进制数组。 该函数接收二进制数组V,并将由V表示的数字的值增加到以下具有相同单位数的数字。如果可以执行操作,则函数返回true(java) 例如: v = {0,0,0,1,1,0,0,1,1} => return true, v = {0,0,0,1,1,0,1,0,1} 我这样写: public static boolean incrementSameOnes(int[] vec) { boolean succ=false; int[] v=n

如何使用递归函数提升二进制数组。 该函数接收二进制数组V,并将由V表示的数字的值增加到以下具有相同单位数的数字。如果可以执行操作,则函数返回true(java)

例如:

v = {0,0,0,1,1,0,0,1,1} => return true, v = {0,0,0,1,1,0,1,0,1}
我这样写:

public static boolean incrementSameOnes(int[] vec)  {
    boolean succ=false;
    int[] v=new int[vec.length-1];
    if(vec.length==1){
        return false;
    }
    if (vec[vec.length-1]==1 && vec[vec.length-2]==0)
    {
        vec[vec.length-2] = 1;
        vec[vec.length-1] = 0;
        System.out.print(Arrays.toString(vec));
        return true;
    }else {
        for(int j=0;j<vec.length-1;j++)
            v[j]=vec[j];
        succ=incrementSameOnes(v);  
        }
    return succ;
}
public静态布尔增量sameones(int[]vec){
布尔成功=假;
int[]v=新的int[vec.length-1];
如果(向量长度==1){
返回false;
}
if(向量[vec.length-1]==1&&vec[vec.length-2]==0)
{
向量[vec.length-2]=1;
向量[vec.length-1]=0;
系统输出打印(Arrays.toString(vec));
返回true;
}否则{

对于(int j=0;j如果我理解正确,您希望在二进制表示中找到下一个更高的整数,具有相同数量的设置位,对吗?如果是这样,我建议:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] x = { 1, 1, 1, 0, 1, 1, 0 };
        System.out.println("original: " + Arrays.toString(x));
        if (promote(x)) System.out.println("promoted: " + Arrays.toString(x));
        else System.out.println("not promotable");
    }

    private static boolean promote(int[] x) {
        // convert to integer value
        int value = 0;
        for (int i = 0; i < x.length; i++) {
            value += x[x.length - 1 - i] * (1 << i);
        }
        int newValue = value + 1, maxValue = 1 << x.length;
        int nBits = getNumberOfSetBits(value);

        // increase value until same amount of set bits found
        while (newValue < maxValue && getNumberOfSetBits(newValue) != nBits)
            newValue++;

        // convert back to array
        if (newValue < maxValue) {
            for (int i = 0; i < x.length; i++) {
                x[x.length - 1 - i] = (newValue & (1 << i)) >> i;
            }
            return true;
        } else {
            return false;
        }
    }

    // kung fu magic to get number of set bits in an int
    // see http://stackoverflow.com/a/109025/1137043
    private static int getNumberOfSetBits(int i) {
        i = i - ((i >> 1) & 0x55555555);
        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
        return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
    }
}

编辑:对于像您的示例中那样的2D数组,转换为int和返回到数组格式看起来有点不同,但我建议使用相同的方法。

我编写了另一个函数,它简单地升级数组,而不管单位数是多少,然后使用递归函数,我使用了它,但我无法停止转换“促进”这个词是什么在这种情况下是什么意思?如果它是递增的,你的例子是不正确的。其目的是函数增加数组,但保留相同的单位数,而使用单位,你的意思是相同的设置位数?谢谢,问题不在于位,而在于0和1的表示,例如以下矩阵:{{101},{1,1,0},{1,1,0}-->return{1,0,1}{1,1,1},{0,0,1}}谢谢你,问题不在于0和1的表示,例如下面的矩阵:{101},{1,1,1,0},{1,1,0}-->return{1,0,1}{1,1,1},{0,0,1}我不理解你的“提升”。您能更详细地解释一下吗?我刚刚添加了一个
int
数组的示例。希望这就是您所寻找的。;)由于我以前使用整数的实现是错误的,因此我将删除它(它对您没有任何帮助^^)
original: [1, 1, 1, 0, 1, 1, 0]
promoted: [1, 1, 1, 1, 0, 0, 1]