【问题标题】:Alternating string of characters and digits交替的字符串和数字
【发布时间】:2013-04-24 15:03:55
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • 你已经尝试了什么?如果人们看到您为实现您的需要付出了一些努力,您会找到更好的答案。
  • Ah ic.. 好的,我很快就会写一个正式的代码。但我现在想到的是使用 is_empty() 来检查队列中是否有项目,并且它必须以某种方式在检查 2 之间交替。
  • 按照建议查看 String.replaceAll 方法以获取分隔的 Strings 和 String.toCharArray 以获取字符数组。然后迭代两个 char 数组以获取组合字符串。
  • 好的,所以你建议我把它分解成一个字符数组?但是您如何解释“4”、“g”和“h”排除?
  • @kent 请看下面我的回答。

标签: java string queue character alternating


【解决方案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));
    }
}

【讨论】:

  • 谢谢,所以通过链表实现队列?但根据你建议的方式,它不会产生 [a,b,c,d,e,f,g,h,j,k] & [1,2,3,4,5,6,7,8 ,9]。第一个有 10 个元素,而第二个只有 9 个。这不会只漏掉“k”吗?
  • 抱歉给您添麻烦了。顺便说一句,我没有投反对票。 ppl shd appriecate 你的好意来帮助:(
  • @kent 我的代码没有给出正确的答案。我刚刚修好了
  • 好的,无论如何这是做什么的 "Runner.main(StringTest.class, new String[0]);"在 main 方法中?
  • 当然.. 让我看看我是否正确理解了代码。您使用增强的 for 循环循环遍历 char[] 中的元素,如果它处于 'num_mode' 中,则调用 processQueue(),否则它会被添加到 letterQueue 中,并且与 num 相同。标志会相应更新。并且您在最后打印之前使用 s 字符串生成器来保存临时值。嗯,这是我第一次遇到 stringbuilder ;)
【解决方案2】:

看到这个提示:

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

【讨论】:

  • 谢谢!那么'd'是小写字符的正则表达式吗?抱歉,我对所有这些都太陌生了。
  • 太棒了.. 但是 '4', 'g' 'h' 和顺序与预期的输出有点不同。非常感谢!尽管如此,我还是学到了一些关于 replaceAll() 的新知识。
  • @kent 你想要一个字符后跟一个数字...是吗?
  • 只是把代码交给OP对他下次做任何努力没有多大帮助。在这种情况下,我认为一般指南或建议会是更好的方法。他正在学习,所以给他一些建议,让他犯错误并从自己身上学习是可取的,如果他有一些具体的问题,那就用一些代码帮助他。恕我直言。
猜你喜欢
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多