我遇到一个问题,我需要询问用户输入他们希望滚动骰子的次数,以及创建和打印具有请求的滚动的数组。到目前为止,我可以创建数组,但问题的另一部分是,每当有连续的重复滚动时,我必须在它们周围加上括号。例如输入11,创建数组
{1,2,1,4,4,6,2,3,5,5,5}将打印1 2 1(4 4)6 2 3(5 5 5)
到目前为止,我已写过
import java.util.Scanner;
import java.util.Random;
public class HW0603 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("How many times would you like to roll: ");
System.out.println();
int x = input.nextInt();
run(rolls(x), x);
}
public static int[] rolls(int x) {
Random random = new Random();
int y[] = new int[x];
for (int i = 0; i < x; i++) {
int z = random.nextInt(6) + 1;
y[i] = z;
}
return y;
}
public static void run(int a[], int b) {
for (int i = 1; i < b; i++) {
System.out.print(a[i] + " ");
}
}
}
至于括号我真的不知道如何开始。使用if语句对我不起作用,因为我将a[i]
与a[i+1]
和a[i-1]
进行比较,我的if语句变体似乎给了我超出范围的错误。任何人都可以给我一个开始的地方或提取连续重复的一些技巧吗?
答案 0 :(得分:1)
您需要将当前项目与下一项目进行比较
如果相等,请打印“(”然后打印该项目
使你打开的标志paranOpened
(,所以你不要重新打开(再次,为了避免这种情况:1 (2(2(2...
,然后当curr!= next时,根据该标志打印项目或打印项目然后关闭“)”
在循环结束时
打印从循环..;i < b - 1;..
中排除的lat项目(b-1),并检查是否已打开“(”
您的run()
方法将是这样的
static boolean paranOpened = false;
public static void run(int a[], int b) {
for (int i = 0; i < b - 1; i++) {
if (a[i] == a[i + 1]) {
if (!paranOpened) {
paranOpened = true;
System.out.print(" (");
}
System.out.print(a[i] + " ");
} else {
System.out.print(a[i] + " ");
if (paranOpened) {
System.out.print(") ");
paranOpened = false;
}
}
}// for loop
// print last item in array @(b-1)
System.out.print(a[b - 1] + " ");
// check if opened ( , then close it
if (paranOpened) {
System.out.print(") ");
}
}// run()
这是一个快速的解决方案,可能有更好的算法
答案 1 :(得分:1)
在这里,我试图创建一个简洁易读的例子:
示例代码:
public class HelloWorld {
public static void main(String[] args) {
int arr[] = { 1, 2, 1, 4, 4, 6, 2, 3, 5, 5, 5 };
printConsecutiveInBrace(arr);
}
public static void printConsecutiveInBrace(int arr[]) {
int printFrom = 0;
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1 || arr[i] != arr[i + 1]) {
print(arr, printFrom, i);
printFrom = i + 1;
}
}
}
public static void print(int arr[], int printFrom, int printTo) {
if (printFrom < printTo) //Here check: Consecutive Duplicate
System.out.print("( ");
for (int i = printFrom; i <= printTo; i++)
System.out.print(arr[i] + " ");
if (printFrom < printTo)
System.out.print(") ");
}
}
<强> 输出: 强>
1 2 1 ( 4 4 ) 6 2 3 ( 5 5 5 )
答案 2 :(得分:1)
程序的第一个问题是run方法中的计数器启动 从1应该是零。您当前的程序不会打印数组的第一个元素。
然后你需要用下一个元素检查每个元素,看它们是否重复,是否打开括号,反之亦然。
不需要检查最后一个元素,因此在循环外打印并在需要时关闭括号。
顺便说一下,你不需要传递数组大小元素。只需使用array.length方法。
public static void run(int a[], int b)
{
boolean pOpen = false;//keep track if parenthesis is open
for (int i = 0; i<a.length; i++)
{
if (i < a.length-1)//prevent out of bound exception
{
if (a[i] == a[i+1] && !pOpen )// check if it is needed to `open or close the parenthesis`
{
System.out.print("(");
pOpen = true;
}
System.out.print(a[i] + " ");
if (a[i] != a[i+1] && pOpen)
{
System.out.print(")");
pOpen = false;
}
}
}
System.out.print(a[a.length-1]);//print the last element
if (pOpen)//close the parenthesis if open
{
System.out.print(")");
}
}
答案 3 :(得分:1)
遍历你的数组并保留一个标记括号是否已打开的布尔值。
import java.util.*;
class Ideone
{
public static int[] rolls(int x) {
Random random = new Random();
int y[] = new int[x];
for (int i = 0; i < x; i++) {
int z = random.nextInt(6) + 1;
y[i] = z;
}
return y;
}
public static void run(int a[], int b) {
StringBuilder sb = new StringBuilder();
String out = "";
boolean parens = false;
for (int j = 0; j < a.length; j++)
{
out = "" + a[j]; //by default just add an element
//check for duplicate and build parenthesis
if (j + 1 < a.length && a[j] == a[j+1]) //duplicate found
{
if (!parens) // if no parenthesis
{
parens = true; //start parenthesis
out = "( " + a[j];
}
}
else
{
if (parens) //if parenthesis already started
{
out = a[j] + " )";
parens = false; //stop parenthesis
}
}
sb.append(" " + out);
}
// if the last element occured multiple times
if (parens) //should end parens
{
sb.append(a[a.length-1] + " )");
}
//print out the result
System.out.println(sb.toString());
}
public static void main (String[] args) throws java.lang.Exception
{
Scanner input = new Scanner(System.in);
System.out.print("How many times would you like to roll: ");
System.out.println();
int x = input.nextInt();
run(rolls(x), x);
}
}
答案 4 :(得分:1)
您需要使用布尔值来检查括号是否打开。