当前位置: 首页 > 知识库问答 >
问题:

如何从数组中找到第i个布尔值?

梅飞龙
2023-03-14

从一个布尔数组中找到第i个布尔值,例如:数组是{true, true, false, false, true},该方法将输出int,显示第3个true值,即4。

我已经尝试过一些代码,它可以工作,但我需要使用递归,而不是while函数。

public static int check(int n, boolean[] b, boolean val){
        int i = 0;
        int count = 0;
        while(i < b.length && count <= n){
            if(b[i] == val) count++;
            i++;
        }        
        if(n == count){
            return i;
        }
        else{
            return -1;
        }
    } 

共有3个答案

金宣
2023-03-14

实际函数从0开始计数,所以我在里面传递一个位置-1。如果i=0,那么很明显我们应该返回什么-第一个条目的索引。如果i大于0,假设它为1,那么我们将数组分为两部分:我们已经搜索过的包含第一个条目的部分,以及数组的其余部分。这可以使用subList()完成。现在我们可以在数组的其余部分使用函数i-1,它将在数组的第二部分中找到第一个条目的索引。

此外,我们还必须添加我们剪切的内容的大小,这将是列表。子列表(0,list.indexOf(value)1)。size()这是记住原始数组中的索引所必需的。

    public static void main(String[] args) {
        List<Boolean> list = Arrays.asList(true, true, false, false, true, true, false, false); //8
        int position = 4; //find index of fourth false
        System.out.println(recursiveSearch(list, false, position - 1));

        position = 2; //find index of second true
        System.out.println(recursiveSearch(list, true, position - 1));
    }

    private static int recursiveSearch(List<Boolean> list, boolean value, int i) {
        if(i == 0) {
            return list.indexOf(value);
        } else {
            return list.subList(0, list.indexOf(value) + 1).size() + recursiveSearch(list.subList(list.indexOf(value) + 1, list.size()), value, i - 1);
        }
    }
杨建章
2023-03-14
public class Recursion {
private static boolean[] b = {true, true , false, false, true};
private static int i = 0;
private static int position = 0;

public static void check( int i, boolean[] b, boolean val ) {
    if( i < b.length ) {

        if( b[i] == val ) {
            position = i;
        }

        i++;
        check( i, b, val );
    }
}

public static void main(String[] args) {
    boolean myChoice = true;
    check( Recursion.i, Recursion.b, myChoice );

    System.out.println( "Last " + myChoice + " position computed is " + position );
}

}

递归是关于调用自己的方法。在上面的示例中,该方法检查计数器变量i是否小于布尔数组的长度。随后检查数组的当前元素是否与所选内容匹配。如果是,则将计数器值分配给位置(最后计算的位置)。计数器递增,方法调用自身。

该过程继续,直到i等于布尔数组的大小。此时,方法停止调用自身。

邓元白
2023-03-14

您可以这样做:

int f(int n,boolean[] b,boolean val,int i)
{
    if(i>=b.length)
        return -1;
    if(b[i]==val)
    {    
        if(n==1)
        return i;
        else
        return f(n-1,b,val,i+1);
    }
    return f(n,b,val,i+1);
}
 类似资料:
  • 问题内容: 我想知道是否有一种已知的,内置的/优雅的方法来找到匹配给定条件的JS数组的第一个元素。AC#等效项为List.Find。 到目前为止,我一直在使用这样的两功能组合: 然后我可以使用: 但是,既然ECMAScript中有[太多的函数式数组方法,也许已经有这样的东西了?我想很多人必须一直执行这样的事情… 问题答案: 从ES6开始,存在数组的本机方法。一旦找到第一个匹配项并返回值,此操作将停

  • 我想知道是否有一种已知的、内置的/优雅的方法来查找匹配给定条件的JS数组的第一个元素。C#的等价物将是list.find。 到目前为止,我一直在使用这样的两个功能组合: 然后我可以使用: 但是由于ECMAScript中有这么多函数式数组方法,也许已经有类似的东西了?我想很多人都要一直在做这样的事情...

  • 问题内容: 我想找到小于或等于n的第k个根的最大整数。我试过了 但是对于n = 125,k = 3,这给出了错误的答案!我碰巧知道5的立方是125。 有什么更好的算法? 背景:在2011年,这次滑坡使我击败了Google Code Jam。https://code.google.com/codejam/contest/dashboard?c=1150486#s=p2 问题答案: 一个解决方案首先通

  • 没有循环或辅助方法,我需要检查arr[i...arr.length-1]是否有一个等于diff的两段和,例如我有:diff=1, i=2, arr={3, 4, 1, 1, 2, 0, 1, 1, 3}它返回true,因为总和{1,1,2,0}(4)减去总和{1,1,3}(5)等于diff(1)。我试图想办法甚至没有循环的总和arr,我唯一想到的是将其添加到diff,但后来我失去了我原来的diff

  • 问题内容: 我想创建以下查询的等效项- 我使用必须和应该尝试了布尔查询的不同组合,但似乎没有任何效果。能做到吗? 问题答案: 这样的事情怎么样:

  • 假设我有整数0到100的数据帧。我想把这些值分为3部分,低、中、高,低小于33,高大于66,中介于33和66之间。所以我用 我得到了一个错误 我已经尝试过if-else语句和以及其他操作符。低和高起作用,但中间不起作用。 请问我能知道附近的路吗?