1

我被赋予了这个问题来解决。我对它应该如何实现只有一点点想法,而且我对编程和东西都太陌生了,很想听听你对此的评论。

假设给定一个“abc1234defgh567jk89”形式的字符串,我必须创建一个新字符串“a1b2c3d5e6f7j8k9”。

请注意,有相应的 [digits] & [characters] 组,并且由于一种类型可能比另一种类型更多,因此输出只有匹配序列,在这种情况下忽略额外的数字或字符 '4' & 'g' & ' H'。

我知道我将不得不使用 2 组队列来存储这两种类型的元素,但我不知道如何从这里开始。

如果您能分享一个伪代码或 Java(最好)版本,我将不胜感激,因为我现在正在通过这种语言学习。

谢谢你。

4

2 回答 2

1

伪代码:

Queue letterQueue;
Queue numberQueue;

for (every character in the string) {
    if (it's a letter) {
        if (numberQueue is not empty) {
            add the letters alternating into the buffer (stringbuilder), and purge buffers
        }
        add newest letter to letterqueue
    }
    if (it's a number) {
        add newest letter to numberqueue
    }
}
add any remaining unprocessed letters to the queue (this will happen most of the time)

return contents of string buffer

你会需要:

代码:

import java.util.LinkedList;
import java.util.Queue;

public class StringTest {
    private static String str ="abc1234defgh567jk89";
    
    private static String reorganize(String str) {
        Queue<Character> letterQueue = new LinkedList<>();
        Queue<Character> numberQueue = new LinkedList<>();
            
        StringBuilder s = new StringBuilder();
        
        for (char c : str.toCharArray()) {
            if(Character.isLetter(c)) {
                if (!numberQueue.isEmpty()) processQueues(letterQueue, numberQueue, s);
                letterQueue.offer(c);
            } else if(Character.isDigit(c)) {
                numberQueue.offer(c);
            }
        }
    
        processQueues(letterQueue, numberQueue, s);

        return s.toString();
    }
    
    private static void processQueues(Queue<Character> letterQueue, Queue<Character> numberQueue, StringBuilder s) {
        while(!letterQueue.isEmpty() && !numberQueue.isEmpty()) {
            s.append(letterQueue.poll());
            s.append(numberQueue.poll());
        }
        letterQueue.clear();
        numberQueue.clear();
    }
    
    public static void main(String... args) {
        System.out.println(reorganize(str));
    }
}
于 2013-04-24T15:12:23.727 回答
0

看到这个提示:

String str = "abc1234defgh567jk89";
String c = str.replaceAll("\\d", "");  // to store characters
String d = str.replaceAll("\\D", ""); // to store digits

尝试这个:

public static void main(String[] args) {
    String str = "abc1234defgh567jk89";
    String c = str.replaceAll("\\d", "");
    String d = str.replaceAll("\\D", "");
    String result = "";
    int j = 0, k = 0;
    int max = Math.max(c.length(), d.length());
    for (int i = 0; i < max; i++) {
        if (j++ < c.length())
            result = result + c.charAt(i);
        if (k++ < d.length())
            result = result + d.charAt(i);
    }
    System.out.println(result);
}

输出:

a1b2c3d4e5f6g7h8j9k
于 2013-04-24T15:08:20.090 回答