我正在研究这个代码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);
}