我无法让以下程序正常运行。遇到字符串N
中的dursend
时,它会使用.split
。然后,它为每个1
收集N
,为N收集2
,然后收集一个Q
,依此类推。然后必须收集一些0
,它们等于Q
的数量。正确的输出应该是:
011111120111111201111111111111111
,其中应忽略第一个0
。我得到的输出是:01111112011111201111111111111110
,
因此,在第一个0
程序出错后打印2
之后似乎是错误的:它提供了5次1
而不是1
的6次。
public class T3 {
public static void main(String[] args)
{
String durs = "NNNNNNNQNNNNNNNQNNNNNNNNNNNNNNNN";
System.out.println(durs);
int d = countOccurrencesDurations(durs, 'N');
int d1 = countOccurrencesDurations(durs, 'Q');
int m = 32;
int[] cdn = new int[m];
int d2;
StringBuffer sb = new StringBuffer(durs);
String dursend = sb.append("W").toString();
String[] a = new String[d];
a = dursend.split("N");
// int alen = a.length + d1 - 1;
// System.out.println("a: " + alen);
int i = 1;
while (i < a.length) {
// System.out.println("N" + a[i]);
d2 = countOccurrencesDurations(a[i], 'Q');
// System.out.println(d2);
int d3 = d2 + 1;
cdn[i] += d3;
for (int j = 0; j < d2; j++) {
i++;
cdn[i] += 0;
}
i++;
}
for (int k = 0; k < m; k++) {
System.out.print(cdn[k]);
}
}
public static int countOccurrencesDurations(String haystack, char needle)
{
int count = 0;
for (int i = 0; i < haystack.length(); i++) {
if (haystack.charAt(i) == needle) {
count++;
}
}
return count;
}
}
答案 0 :(得分:0)
如果您需要有效的解决方案,可以使用此功能。 我根据您的评论更新了我的解决方案。
public class Main {
private static String result;
public static void main(String[] args) {
String durs = "NNNNNNQQNNNNNNNQNNNNNNNNNNNNNNNN";
result = "";
int qCount = 0;
for(int i = 0; i < durs.length(); i++){
if (durs.charAt(i) == 'N'){
// Process accumulated Q's from before
if (qCount > 0){
processQ(qCount);
qCount = 0;
}
// Do nothing if there is a Q next to us
if ((i != durs.length() - 1) && durs.charAt(i + 1) == 'Q'){
continue;
}
result += "1";
}else{
qCount++;
}
}
if (qCount > 0){
processQ(qCount);
}
System.out.println(result);
}
private static void processQ(int qCount) {
if (qCount > 0){
result += (qCount + 1);
for(int j = 0; j < qCount; j++){
result += "0";
}
}
}
}
我相信这个工作正常。
答案 1 :(得分:0)
您可以尝试这个简化版本(有点与您的实现一致):
StringBuilder sb = new StringBuilder();
char last = 0;
for (char c : durs.toCharArray()) {
if (c == 'Q' && last == 'N') {
sb.deleteCharAt(sb.length() - 1);
sb.append("20");
} else if (c == 'N') {
sb.append("1");
}
last = c;
}
System.out.println(sb.toString());