我在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
我不太确定我是不是正确理解了这个问题,或者我是否因为大输入案件而出现溢出,我看不到其他测试用例但是希望你们能看一看代码。
欢迎任何帮助。
谢谢!
答案 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();
}
}