当前位置: 首页 > 知识库问答 >
问题:

想删除star和前面的char并跟随它,为什么我的代码不起作用

酆意智
2023-03-14

返回给定字符串的一个版本,其中对于字符串中的每个star(*),紧邻其左右的star和chars都消失了。因此“ab*cd”产生“ad”,“ab**cd”也产生“ad”。这是一个编码蝙蝠问题。

public class DeleteStar {

    public static void main(String[] args) {
        String s=deleteS("ab*ab");
        System.out.println(s);
    }

    public static String deleteS(String s)
    { 
        StringBuilder sb=new StringBuilder();

        for (int i=0;i<s.length();i++)
        {
            sb.append(s.charAt(i));     
        }

        System.out.println(sb.toString());

        for (int i=0;i<sb.length();i++) 
        { 
            if (sb.charAt(i)+""=="*")
            {
                sb.deleteCharAt(i);
                sb.deleteCharAt(i-1);
                sb.deleteCharAt(i+1);
            }
        }

        return sb.toString();
    }
}

共有3个答案

穆远
2023-03-14

那么这样的解决方案呢?

package eu.duernau.stackoverflow;

public class Sov33355763 {

    public static void main(String[] a) {
        String s = deleteS("aba*b");
        System.out.println(s);
        s = deleteS("ab*ab");
        System.out.println(s);
        s = deleteS("ab*cd*ef*ghij*");
        System.out.println(s);
        s = deleteS("0*ab*cd*ef*ghij*");
        System.out.println(s);
        s = deleteS("****acd****");
        System.out.println(s);
    }

    private static String deleteS(String s) {
        StringBuilder sb = new StringBuilder(s);
        int lastStarPosition;
        do {
            lastStarPosition = sb.lastIndexOf("*");            
            if (lastStarPosition > 1 && lastStarPosition + 1 < sb.length()) {
                sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
            } else {
                if (lastStarPosition + 1 == sb.length()) {
                    sb.replace(lastStarPosition - 1, lastStarPosition + 1, "");
                } else {
                    if (lastStarPosition > 0) {
                        sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
                    } else {
                        if (lastStarPosition > -1) {
                            sb.replace(lastStarPosition, lastStarPosition + 2, "");
                        }
                    }
                }
            }
        } while (lastStarPosition > -1);
        return sb.toString();
    }
}

生产

ab
ab
ahi
hi
d
酆高翰
2023-03-14

你必须使用equals方法来比较objects==检查它是否是同一个实例,而不是它是否有相同的值,即:

 (sb.charAt(i)+""=="*")

应该是

 ((sb.charAt(i)+"").equals("*"))

此外,还应使用字符串ie的替换方法:

"abxxxcd".replace("xxx","");

我认为*可能被解释为一个正则表达式,所以你必须使用\(我不确定你必须尝试它或阅读javadoc)

另一个可以解决这个问题的想法是:

 (sb.charAt(i)=='*')

“*”被解释为一个字符

邹修真
2023-03-14

删除字符时,字符串长度也会缩短1。因此,如果你在“ab*cd”上调用你的序列,假设我们知道i=2,我们会得到:

sb.deleteCharAt(i); // We now have "abcd"
sb.deleteCharAt(i-1); // We now have "acd"
sb.deleteCharAt(i+1); // Oops! "acd" has no index of 3!

但是,即使我们正确地完成了上述工作,如果我们有两颗相邻的恒星,这也会产生问题。因此,在删除之前,我们应该检查相邻字符是否为星星。例如,如果我们在“ab**cd”上运行,我们将得到:

// This is the correct way if no stars are adjacent to each other.
// But if there are? Testing on "ab**cd"
sb.deleteCharAt(i-1); // We now have "a**cd"
sb.deleteCharAt(i-1); // We now have "a*cd"
sb.deleteCharAt(i-1); // We now have "acd"...wait, we need to delete c too!

另一个问题是您在迭代字符串生成器时正在修改它。这是一个坏主意,因为您会有错误的索引!考虑以下内容:

// We execute this on "ab*cd*ef", expecting "af".
for (int i = 0; i < sb.length(); i++) { // length = 8
    if (sb.charAt(i) + "" == "*") {
        // First execution, i = 2. Second, i = 5.
        sb.deleteCharAt(i-1);
        sb.deleteCharAt(i-1);
        sb.deleteCharAt(i-1);
        // After we executed the first time, we get that sb's length
        // is now 5! Wait, so next time when we try to delete the i-1 
        // character, we are removing...f? That cannot be right!
    }
}

因为这是一个编码练习,所以我将实际调试留给您自己。这是一个学习过程,要弄清楚事情为什么是这样的!:)

 类似资料:
  • 我遵循Rails指南:http://guides.rubyonrails.org/getting_started.html 我的索引中有下面一行。html。雇员再培训局: 但它不起作用;它只会进入展示页面。 供你参考,这是我的路线。rb: 我的控制器: 我的申请书。js: 我的申请书。html。雇员再培训局: 请注意,我已尝试更改

  • 问题内容: 我正在尝试编写关于弹跳球的代码,但是我仍然沉迷于如何 使弹跳球。该代码似乎是正确的,日食没有错误消息 ,但是球还是没有动。任何帮助/提示表示赞赏。 这是我的代码: 问题答案: 基本上,什么都没有移动。 每次滴答作响,您要做的就是重新粉刷。 您需要将移动逻辑移至已注册的方法Timer 更像… 这样,每次Timer打勾时,您都在相应地更新球的位置… 更新了工作示例 我做了两个更改。我将设置

  • 我用了docker,想删除所有东西 所以我试着移除它,但它并没有消失

  • 问题内容: 考虑以下功能: 它们应该是等效的。但是存在性能差异: 不带的版本else慢10%。这非常重要。为什么? 问题答案: 对我来说,它们的速度几乎相同:(Debian上的Python 2.6.6) 字节码也非常相似: 唯一的区别是,如果控制到达函数主体的末尾,则else返回包含代码的版本None。

  • 我想了两个小时,为什么这段代码不能产生预期的结果。如果我输入3个整数,比如3、4和5,它应该给出所有27个可能的和(假设数字可以是正的、负的或零) 因此,它应该产生以下内容: -3-4-5=-12 -3-4 0 = -7 -4-4 5=3 等等