在 Java 中计算字符串的 1 和 0,并将它们按顺序排列?

Posted

技术标签:

【中文标题】在 Java 中计算字符串的 1 和 0,并将它们按顺序排列?【英文标题】:Counting the Ones and Zeros of an String in Java, and putting them in order? 【发布时间】:2021-12-27 23:33:57 【问题描述】:

我确实有一个很大的问题,编码应该很容易:

我需要创建一个静态公共方法,该方法返回一个字符串,并以字符串的形式获取二进制数。

public static String encode(String a) 

此方法必须计算连续的零和一。如果数字发生变化,则必须为空白。此外,如果第一个数字不是零,程序只需写一个零作为第一个数字。

Example: 11100110111 => "0 3 2 2 1 3"

Other Examples are:
encode("0") --> "1" 
encode("000") --> "3" 
encode("11") --> "0 2" 
encode("011") --> "1 2" 
encode("101") --> "0 1 1 1" 

我不知道该怎么做,如果有人能帮忙就太好了! 我将在此处发布我毫无价值的代码,它无用但最终包含一些有用的信息!

public class Functionality 
    public static void main(String[] args) 
        System.out.println(encode("111"));

    

    public static String encode(String a) 
        int z = 0;
        int v = 0;
        String erg = "";

        while (a.length() == 0) 

            while (v == ErsterWert(a)) 
                z = z + 1;
                subt(a);

            

            String zx = String.valueOf(z);
            erg = erg + zx + " ";
            if (v == 0) 
                v = v + 1;
            

            if (v == 1) 
                v = 0;
            

            z = 0;

        
        String bg = "sds";
        return erg;
    

    public static int ErsterWert(String a) 
        int f = a.charAt(0);
        return f;
    

    public static String subt(String a) 
        a = a.substring(1);
        return a;
    


【问题讨论】:

我确定还有其他问题,但首先,String 在 Java 中是不可变类型,所以subt(a); 不会改变a 的值。你需要做类似a = subt(a);的事情。 我建议您阅读循环的工作原理。 IE。 while (a.length() == 0) 和 while (v == ErsterWert(a)) 将是无限循环,因为检查的条件永远不会改变。例如,您可以使用 charAt(int index) 方法遍历每个字符,并将其与当前值(1 或 0)进行比较。如果字符对应于当前值 - 增加计数器。一旦字符与当前值不同 - 将计数器值添加到字符串并重置计数器。 【参考方案1】:

这里有一句话可以打动你的教授:

public static String encode(String a) 
    return (a.startsWith("1") ? "0 " : "") +
        Arrays.stream(a.split("(?<=(.))(?!\\1)"))
          .map(String::length)
          .map(String::valueOf)
          .collect(Collectors.joining(" "));

这将字符串拆分为不同的字符,方法是使用后向来捕获前一个字符,并使用负前瞻来向后引用捕获的字符。

将这些子字符串转换为它们的长度,然后将长度转换为字符串,最后连接到一个由空格分隔的字符串。

第一个字符为1 的特殊情况通过ternary 处理。

【讨论】:

【参考方案2】:

使用字符串函数indexOfsubstring 的递归解决方案可能如下所示:

我们尝试在字符串开头找到一个数字 X 与该数字相反的位置来计算前缀的长度。
public static String encode(String str) 
    if (str.startsWith("1")) 
        // append 0 at start, look for 0 after 1's
        return "0 " + encode(str, 0);
    
    // string starts with 0, look for the first 1 after 0's
    return encode(str, 1);


// d - the digit to look for after current prefix 
public static String encode(String z, int d) 
    int pos = z.indexOf(String.valueOf(d));
    if (pos == -1)  // nothing found after current prefix
        return String.valueOf(z.length());
    
    // append prefix length and toggle the number to look for
    return String.valueOf(pos) + " " + encode(z.substring(pos), 1 - d);

测试:

for (String s : Arrays.asList("0", "1", "000", "11", "011", "101", "0011100001111100")) 
    System.out.println(s + " -> " + encode(s));

输出:

0 -> 1
1 -> 0 1
000 -> 3
11 -> 0 2
011 -> 1 2
101 -> 0 1 1 1
0011100001111100 -> 2 3 4 5 2

【讨论】:

以上是关于在 Java 中计算字符串的 1 和 0,并将它们按顺序排列?的主要内容,如果未能解决你的问题,请参考以下文章

charAt() 方法如何从字符串中获取数字并将它们放入 Java 中的新字符串中?

如何从输入字符串中分离整数并将它们转换为 int 类型以允许对它们进行计算

如何组合字符串中的字母并将它们保存到JAVA,Android中的其他变量中

在java中用键盘输入多个字符串,并将它们打印出来

Java:拆分字符串并将它们放入文本区域的

用JAVA编写一程序:从键盘输入多个字符串到程序中,并将它们按逆序输出在屏幕上。