STRAN
STRAN

Reputation: 73

Finding Consecutive Duplicate integers in an array

I have a problem in which I need to ask for user input for how many times they wish to roll a die and to create and print that an array that has the rolls requested. So far I can create the array, however another part of the problem is that whenever there are consecutive duplicate rolls I must put parentheses around them. For example inputting 11, creates the array

{1 , 2 , 1 , 4 , 4, 6 , 2 , 3 , 5 , 5 , 5} would print 1 2 1 ( 4 4 ) 6 2 3 ( 5 5 5 )

So far I have written

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] + " ");
        }
    }
}

As for the parentheses I honestly don't know how to start. Using if statements didn't work for me, my if statement variations seem to give me out of bound errors since I compare a[i] to a[i+1] and a[i-1]. Could anyone give me a place to start or some tips to being extracting consecutive duplicates?

Upvotes: 2

Views: 4873

Answers (5)

mmuzahid
mmuzahid

Reputation: 2280

Here I've tried to create a clean and readable example:

Sample code:

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(") ");
    }
}

Output:

1 2 1 ( 4 4 ) 6 2 3 ( 5 5 5 )

Upvotes: 1

user6023251
user6023251

Reputation:

You need to use boolean to check whether your parenthesis is open or no.

Upvotes: 1

Iterate through your array and keep a boolean that marks if parenthesis have opened.

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);
    }
}

Upvotes: 1

Leo The Four
Leo The Four

Reputation: 699

The first problem with you program is that the counter in your run method starts from 1 which should be zero. Your current program does not print the first element of the array.

then you need to check each element with the next one to see if they are duplicate and if they are open the parenthesis and vice versa.

The last element does not need to be checked so print it outside the loop and close the parenthesis if needed.

By the way you do not need to pass the array size element with it. Just use the array.length method.

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(")");
        }
    }   

Upvotes: 1

Yazan
Yazan

Reputation: 6082

you need to compare current item with next item if equal, print "(" then print the item make flag paranOpened that you have opened (, so you don't reopen ( again, to avoid this: 1 (2(2(2..., then when curr!=next, based on that flag either print the item or print the item then close the ")"

at end of loop

print lat item (b-1) that was excluded from the loop ..;i < b - 1;.., and check if you have opened "("

your run() method will be like this

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()

this is a quick solution, there could be better algorithms

Upvotes: 1

Related Questions