硬币翻转然后找到最长的头部条纹 - Java



我正在研究这个代码HS AP CompSci问题(4.3.6)

基本上,我必须模拟抛硬币100次,打印出结果(正面或反面),但最终我需要打印出最长的正面条纹。

public class LongestStreak extends ConsoleProgram
{
    public static final int FLIPS = 100;
    boolean tailsChosen = true;
    int count_tails=0;
    int count_heads=0;
    int streak = 1; 
    public void run()
    {
        for (int i= 1; i<=100; i++)
        {
            tailsChosen= Randomizer.nextBoolean();
            if (tailsChosen) 
            {
                System.out.println("Tails");
                count_tails++;     
            }
            else
            {
                System.out.println("Heads");
                count_heads++;
            } 
        }
        System.out.println("Longest streak of heads: " + streak );
    }
}

这是我到目前为止的编码。我已经努力使我可以随机打印出100个正面和反面,但就是找不到找到最长的头部条纹的方法。

谢谢

当它是正面时,您可以增加条纹,如果是尾部,则可以将其重置为 0。然后你把它与之前的maxHeadStreak进行比较。

int streak = 0; // should be init to zero
// other codes
for (int i= 1; i<=FLIPS; i++) // use your constant
{
    tailsChosen= Randomizer.nextBoolean();
    if (tailsChosen) 
    {
        System.out.println("Tails");
        count_tails++;     
        streak = 0;
    }
    else
    {
        System.out.println("Heads");
        count_heads++;
        streak++;
        maxHeadStreak = Math.max(streak, maxHeadStreak);
    } 
}

我建议使用max_head_streak变量来存储迄今为止实现的最大头部条纹。每次翻转头部时,count_heads变量都会递增。

一旦尾部被翻转并且头部条纹被打破,请检查您当前的头部条纹是否高于您的最大头部条纹,以及它是否设置为max_head_streak当前count_heads。然后将当前头数count_heads设置回 0。

掷出100枚硬币后,打印max_head_streak .

public static final int FLIPS = 100;
boolean tailsChosen = true;
int max_head_streak=0;
int count_heads=0;
public void run()
    {
        for (int i= 1; i<=FLIPS; i++)
        {
            tailsChosen= Randomizer.nextBoolean();
            if (tailsChosen) 
            {
                System.out.println("Tails");
                if (max_head_streak < count_heads)
                {
                    max_head_streak = count_heads;
                {
                count_heads = 0;
            }
            else
            {
                System.out.println("Heads");
                count_heads++;
            }
        }
    System.out.println("Longest streak of heads: " + max_head_streak);
}

一些评论:

  • 您可以省略tails_count,因为您不需要计算尾巴。

  • 您在开始时定义翻转次数,但从不使用它。
    只需将FLIPS放入循环声明中即可。

public class LongestStreak extends ConsoleProgram
{
    public static final int FLIPS = 100;
    public void run()
    {
        int headStreak = 0;
        int longestHeadStreak = 0;
        for (int i = 0; i < 10; i++)
        {
            if (Randomizer.nextBoolean())
            {
                System.out.println("Heads");
                headStreak++;
            }
            else
            {
                System.out.println("Tails");
                if (longestHeadStreak < headStreak)
                {
                    longestHeadStreak = headStreak;
                }
                headStreak = 0;
            }
        }
        System.out.println("Longest streak of heads: " + longestHeadStreak);
    }
}

这样的事情应该可以。

从本质上讲,跟踪当前连胜的长度(您清楚地意识到了这一点),然后跟踪它的最大值。

public class LongestStreak {
    public static final int FLIPS = 100;
    Random random = new Random();
    boolean lastFlip = true;
    int count_tails = 0;
    int count_heads = 0;
    int streak = 0;
    int longestTailsStreak = 0;
    int longestHeadsStreak = 0;
    public void run() {
        for (int i = 1; i <= FLIPS; i++) {
            // Flip the coin.
            boolean itsTails = random.nextBoolean();
            // Keep track of the length of the current streak.
            if (itsTails == lastFlip) {
                // The streak continues.
                streak += 1;
            } else {
                // End of streak.
                if (itsTails) {
                    // It must have been a run of heads.
                    longestHeadsStreak = Math.max(longestHeadsStreak, streak);
                } else {
                    // It must have been a run of tails.
                    longestTailsStreak = Math.max(longestTailsStreak, streak);
                }
                streak = 0;
            }
            // Count them.
            if (itsTails) {
                System.out.println("Tails");
                count_tails += 1;
            } else {
                System.out.println("Heads");
                count_heads += 1;
            }
            lastFlip = itsTails;
        }
        System.out.println("Longest streak of heads: " + longestHeadsStreak);
        System.out.println("Longest streak of tails: " + longestTailsStreak);
    }
}
In JavaScript:

 function longestHeadsStreak(arr) {
    let headsStreak = 0; 
    let longestStreak = 0; 
    for(var i = 0; i < NUM_FLIPS; i++) {
     int x = i + 1
     if(arr[i] == "Heads") {
      headStreak++
      }
      if(arr[x] != "Heads") {
       if(longestStreak < headsStreak) {
         var longestStreak = 0;
         longestStreak += headsStreak;
         }
         headsStreak = 0;
         }
console.log("Longest Streak of Heads: " + longestStreak);
}

最新更新