我正在学习Java编程入门课程,我们的任务之一是编写一个程序,该程序模拟用户指定次数投掷硬币。功能类CoinToss.java如下所示:
public class CoinToss {
private char[] results;
private int numHeads;
private int numTails;
private double headsFrac;
private double tailsFrac;
private int currentRun;
private char currentOutcome;
public CoinToss(int numTosses) {
results = new char[numTosses];
for(int i = 0; i < results.length; i++) {
double number = Math.random();
if(number < 0.5) {
results[i] = 't';
}
else {
results[i] = 'h';
}
}
}
public void count() {
for(int i = 0; i < results.length; i++) {
if(results[i] == 't') numTails++;
else numHeads++;
}
headsFrac = (double)numHeads/results.length;
tailsFrac = (double)numTails/results.length;
}
public double getFracHeads() {
return headsFrac;
}
public double getFracTails() {
return tailsFrac;
}
public char[] getTosses() {
return results;
}
public void getLongestRun() {
currentOutcome = 'h';
for(int i = 0; i < results.length; i++) {
if(currentOutcome == results[i]) {
currentRun++;
}
else {
currentOutcome = results[i];
currentRun = 1;
}
}
if(currentOutcome == 'h') {
System.out.println("Longest run was " + currentRun + " heads.");
}
else {
System.out.println("Longest run was " + currentRun + " tails.");
}
}
}
我主要关注的领域是
getLongestRun()
方法。说明说:创建一个方法,检查抛硬币的阵列以找到最长的可能被扔掉的头或尾。您将需要两个属性,
这些属性具有当前连续结果的数量(一次运行),并且
与跑步相关的结果(头部或尾部)。循环比较每个折腾
在结果的数组中
当前运行的时间。如果匹配,则当前运行为
现在公认更长。如果不匹配,则当前运行
结束了。比较此运行中具有以下结果的连续结果的数量:
最终获得的连续结果数量最多
以前看过
(到目前为止运行时间最长)。这是否是新的最长
运行,将当前结果重置为刚刚检查的结果,并重置
当前运行到1。考虑是否需要进行任何特殊处理
循环终止时。
我主要关心的是如何使该方法正常工作。它没有正确地计算出连续的最长头数或尾数。
最佳答案
您无需存储每次运行的结果;您只需在新的运行开始时覆盖先前的值即可。这意味着您的getLongestRun()
方法将只打印上一次运行的长度,而不是最长的长度。
为了解决这个问题,您需要将每次运行的结果记录在一个数组中(或者最好是像ArrayList
这样的对象结构),然后遍历它以找到最大值。或者,您可以简单地使用一个变量,该变量始终保持最大条纹,如果最新的字符串小于当前的最大值,则仅丢弃该变量。
由于这是课程,因此我不会为您提供完整的代码,但这是我的意思的伪代码(Pythonic)概念:
current_streak = 0
longest_streak = 0
current_coin = coin_toss_list[0]
for coin in coin_toss_list:
if current_coin == coin:
current_streak = current_streak + 1
else:
if current_streak > longest_streak:
longest_streak = current_streak
current_streak = 1
current_coin = coin
print "Longest streak was " + longest_streak