摩根和String HackerRank

时间:2015-11-25 22:56:53

标签: java string concatenation

我在hackerrank尝试摩根和弦乐挑战 (https://www.hackerrank.com/challenges/morgan-and-a-string/

我的尝试如下:

public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner in = new Scanner(System.in);
        int testCases = in.nextInt();
        for(int i=0; i<testCases; i++){
            StringBuilder a = new StringBuilder(in.next());
            StringBuilder b = new StringBuilder(in.next());
            StringBuilder result = new StringBuilder();
            int indexA = 0;
            int indexB = 0;
            while(indexA < a.length() && indexB < b.length()){
                if(a.charAt(indexA)<=b.charAt(indexB)){
                    result.append(a.charAt(indexA));
                    indexA++;
                }
                else{
                    result.append(b.charAt(indexB));
                    indexB++;
                }
            }
            if(indexA==a.length()){
                result.append(b.substring(indexB,b.length()));
            }
            else{
                result.append(a.substring(indexA,a.length()));
            }
            System.out.println(result.toString());
        }

    }

我正确地得到了前两个案例:

2 插口 DANIEL ABACABA ABACABA

输出:

DAJACKNIEL AABABACABACABA

我不太确定我是不是正确理解了这个问题,或者我是否因为大输入案件而出现溢出,我看不到其他测试用例但是希望你们能看一看代码。

欢迎任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为,当你在两个堆栈顶部都有相同的字母时会出现问题:你不能随意选择(你总是选择第一个或 a 堆栈),但必须比较两个堆栈上的下一个字母(如果它们相同,那么之后的那些等等),这样你就可以确保最佳的延续......

E.g。

input: bbb bba

your output: bbbbba
correct output: bbabbb

答案 1 :(得分:-1)

    import java.util.ArrayDeque;
    import java.util.ArrayList;
    import java.util.Scanner;
    import java.util.Stack;
    public class MorganStack2 {
    static String morganAndString(String a, String b) {


    char[] a1 = a.toCharArray();
    char[] b1 = b.toCharArray();


    ArrayList<Character> s1 = new ArrayList<>();

    ArrayDeque<Character> jackStack = new ArrayDeque<>();
    ArrayDeque<Character> danielStack = new ArrayDeque<>();


    for (int i = a1.length - 1; i >= 0; i--) {
        jackStack.push(a1[i]);

    }

    for (int i = b1.length - 1; i >= 0; i--) {
        danielStack.push(b1[i]);
    }


    int min = Math.min(a1.length, b1.length);
    int max = Math.max(a1.length, b1.length);

    int jack = 0;
    int daniel = 0;

    int c = 0;
    while (!(jackStack.isEmpty() || danielStack.isEmpty())) {
        if (jackStack.peek() < danielStack.peek()) {
            s1.add(jackStack.pop());
            jack++;
        } else if (jackStack.peek() > danielStack.peek()) {
            s1.add(danielStack.pop());
            daniel++;

        } else {
                if (a.substring(jack).compareTo(b.substring(daniel))>0){
                    s1.add(danielStack.pop());
                    daniel++;
                }else if (a.substring(jack).compareTo(b.substring(daniel))<0) 
                  {
                    s1.add(jackStack.pop());
                    jack++;
                }else{
                    if(a.compareTo(b)>=0){
                        s1.add(danielStack.pop());
                        daniel++;

                    }else  if(a.compareTo(b)<0){
                        s1.add(jackStack.pop());
                        jack++;

                    }else{
                        System.out.println("hyy");
                    }
                }


            }
            c++;
        }
      }
        // System.out.println(c);         AAAAAAAAAA
        //System.out.println(max);
        // System.out.println(min);
        if (jackStack.isEmpty()) {
            while (!danielStack.isEmpty()) {
                s1.add(danielStack.pop());
            }
        } else {
            while (!jackStack.isEmpty()) {
                s1.add(jackStack.pop());
            }
        }


        StringBuilder sb = new StringBuilder();

        for (Character s : s1) {
            sb.append(s);

        }


        return sb.toString();
    }



    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args)  {

    int t = scanner.nextInt();
    scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

    for (int tItr = 0; tItr < t; tItr++) {
        String a = scanner.nextLine();

        String b = scanner.nextLine();

        String result = morganAndString(a, b);
        System.out.println(result);


       }



       scanner.close();
      }


  }