当前位置: 首页 > 面试题库 >

在Java中查找连续数

壤驷瑾瑜
2023-03-14
问题内容

我正在尝试使用蒙特卡洛算法查找下周的乐透数字包含连续数字的概率。我认为对数字进行排序可能会使实际查找连续项更加容易,但是在网上搜索了很多之后,似乎并没有什么真正可以帮助我寻找所需内容的信息

import java.util.Random;
import java.util.Arrays;
public class lotto {
    public static String getLottoTicket(){
            String lottoTicket = "";
            Random lottoNumbers = new Random();  //random object
            int [] ticket = new int[6];  //6 lotto numbers
            int counterr = 0;
            int a;
            for( int counter = 0; counter < ticket.length; ++counter ){
                ticket[counter] = (1 + lottoNumbers.nextInt(45) );  //numbers between 1-45
            }
            Arrays.sort( ticket );      //array class .. sorts array
            for(int counter = 0; counter < ticket.length; ++counter ){
                lottoTicket += ticket[counter];
                lottoTicket += " ";   
            }

            return lottoTicket;
    }
    public static void main( String [] args ){
       int a, d, n=1, t, b;
        for(int i=1; i<1000000; i++){
            int counter = 0;
            System.out.println( getLottoTicket() );
       }
    }
}

到目前为止,这就是我所知道的,我知道我将使用计数器来查找百万结果中的连续数,但实际上我只是为如何真正找到连续数而烦恼


问题答案:

首先我读错了问题,对不起,答案很抱歉!

好吧,让我们分手吧。那么首先,我们如何检查两个数字是否连续?如果他们一个接一个。这是正确的,但是我们如何通过编程来表达呢?

这实际上非常简单,如果两个数字之间的差等于1,则两个数字是连续的。因此,要检查两个数字是否连续,只需将它们相减,看看结果是否为1(或-1,取决于顺序)。

现在,解决此问题的完整方法要复杂一些。我们需要在您生成的乐透号码中找到连续的 所有
号码。因此,为了更好地进行分解,我建议将这一部分放入一个单独的方法中,称为getConsecutiveNumbers(int [] lottoNumbers)。这样,您已经完成了基本设置,如下所示:

// Now returns int array instead of String
public static int [] getLottoTicket(){
        Random lottoNumbers = new Random();  //random object
        int [] ticket = new int[6];  //6 lotto numbers
        int counterr = 0;
        int a;
        for( int counter = 0; counter < ticket.length; ++counter ){
            ticket[counter] = (1 + lottoNumbers.nextInt(45) );  //numbers between 1-45
        }
        Arrays.sort( ticket );      //array class .. sorts array

        return ticket;
}

public static void main( String [] args ){
   int a, d, n=1, t, b;
    int totalConsecutives = 0;
    for(int i=1; i<1000000; i++){
        int counter = 0;
        int [] lottoTicket = getLottoTicket();

        // Keep a count of consecutives
        totalConsecutives += getConsecutiveNumbers( lottoTicket );
   }
    System.out.println("Number of consecutives: " + totalConsecutives );
}

现在是主要部分。这个魔术getConsecutiveNumbers()方法有什么用?让我们找出答案。

首先,让我们编写必须放在main方法之外的方法的签名/组成,因为我说过它需要采用一个整数数组,但还需要返回连续数字的数量作为方法名称建议,如果程序询问“连续多少个数字?”
您应该做出相应的反应!该方法将像这样开始:

public static int getConsecutiveNumbers(int [] lottoNumbers) {

    // How many

}

好的。到目前为止,由于您的程序的设置方式,我们可以假定此处分配给我们的乐透号码已经排序。这很好,这意味着我们只需要遍历数组并逐个检查数字是否连续即可。您说我们将如何做?我们也将其分解。

我们需要 遍历 数组以检查每个元素,因此肯定需要某种循环。我看到您已经使用了for循环,让我们开始吧。

for(int i = 0; i < lottoNumbers.length; i++) {
    // Going through each number here
}

现在这是最聪明的部分。对于此循环的每次迭代,我们需要检查element
lottoNumbers[i]是否连续到lottoNumbers[i-1]。你看?用英语,这可能意味着第二个元素与第一个元素是连续的,然后第三个元素与第二个元素是连续的,依此类推,直到i到达数组的末尾。

但是
有一个问题。在循环开始时i为零(这是我们想要的),但是在这种情况下,lottoNumbers[i-1]将给出一个IndexOutOfBoundsException,数组在索引-1处没有元素!因此,为避免此问题,我们需要从1开始而不是从0开始搜索。

public static int getConsecutiveNumbers(int [] lottoNumbers) {
    // i starts at 1 not 0
    for(int i = 1; i < lottoNumbers.length; i++) {
        // Going through each number here
    }

}

那么,我们如何完成呢?让我们这样想。在遍历数组时,每当一个数字连续时,只需将其添加到计数器中,最后返回该计数器即可。

这是最终的解决方案:

public static int getConsecutiveNumbers(int [] lottoNumbers) {
    int consecutives = 0;
    // i starts at 1 not 0
    for(int i = 1; i < lottoNumbers.length; i++) {
        // Going through each number here
        if(lottoNumbers[i] - lottoNumbers[i-1] == 1)
            consecutives++; // Numbers were consecutive

    }

    // Return the number of consecutives
    return consecutives;
}

希望这可以帮助您理解问题并为您带来更多收益,而不仅仅是一个简单的答案!如有任何疑问,请问:)



 类似资料:
  • 问题内容: 我有以下数组 我想找到连续为零的数组的开始和结束索引,输出上方的数组如下所示 我想做得尽可能高效。 问题答案: 这是一个相当紧凑的矢量化实现。我已经更改了一些要求,所以返回值有点“ numpythonic”:它创建一个形状为(m,2)的数组,其中m是零的“游程”数。第一列是每次运行中前0个的索引,第二列是运行后第一个非零元素的索引。(例如,此索引模式匹配切片的工作方式以及函数的工作方式

  • 问题内容: 我在数据库表中有一组相当大的电话号码(大约200万个)。这些数字已插入到块中,因此存在许多连续的数字范围,范围从10个数字到1万个数字。其中一些号码正在使用中,因此标记为不可用,其余号码可用。给定一个特定的数字,我需要一种方法来查找该数字之上和之下的连续数字范围。范围应一直持续到找到不可用的数字或遇到两个范围的边界为止。 例如,给定以下设置: 使用1012作为参数进行搜索应返回1010

  • 问题内容: 在numpy数组中找到最大连续重复nan的最佳方法是什么? 例子: 输入1: 输出1: 输入2: 输出2: 问题答案: 这是一种方法- 这是一个改进的版本- 基准测试-

  • 问题内容: 我有一个pandas.DataFrame,它在连续的时间点进行了测量。与每次测量一起,被观察系统在每个时间点都有不同的状态。因此,DataFrame还包含一列,其中包含每次测量时系统的状态。状态更改比测量间隔慢得多。结果,指示状态的列可能看起来像这样(索引:状态): 是否有一种简单的方法来检索连续相等状态的每个段的索引。那意味着我想得到这样的东西: 结果也可能与普通列表有所不同。 到目

  • 问题内容: 如果我有串,我要检查,如果它作为一个连续存在 串 中,我可以使用: 在非连续子 序列 的情况下,我可以使用什么?例: 问题答案: 我不知道是否有内置功能,但是手动操作相当简单

  • 问题内容: 我需要查询方面的帮助。 我有这个简单的表: 看起来像这样: 我想为给定的readVal获得最后的连续行: 在上面的示例中将是: id:3 for readVal = 2 id:8 for readVal = 3 我尝试了以下查询: 只要该系列中没有缺失的ID,它就可以工作。在上面的示例中,编号4缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返