在数组

时间:2016-02-28 10:14:22

标签: java arrays

我遇到一个问题,我需要询问用户输入他们希望滚动骰子的次数,以及创建和打印具有请求的滚动的数组。到目前为止,我可以创建数组,但问题的另一部分是,每当有连续的​​重复滚动时,我必须在它们周围加上括号。例如输入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语句变体似乎给了我超出范围的错误。任何人都可以给我一个开始的地方或提取连续重复的一些技巧吗?

5 个答案:

答案 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)

您需要使用布尔值来检查括号是否打开。