【问题标题】:reduce string length when it has pair in java当它在java中有对时减少字符串长度
【发布时间】:2019-08-08 05:25:36
【问题描述】:

这里报错----必填变量,找到值 我的代码 例如 aabacc,当我们得到任何像 aa 这样的对时,将其从字符串中删除,最终答案是 (ba)。

公共类解决方案{

// Complete the superReducedString function below.
static String superReducedString(String s) {
    String sn;
    int j=0;
    for(int i=0;i<s.length()-1;i++)
    {
        if(s.charAt(i)!=s.charAt(i+1))
        {
            sn.charAt(j)=s.charAt(i);                           
            j++;
        }
    }
    return sn;
}

【问题讨论】:

  • 你有什么问题?进一步描述。
  • 例如 aabacc,当我们得到任何像 aa 这样的对时,将其从字符串中删除,最终答案是 (ba)。
  • 字符串是不可变的。您不能像在此处尝试那样编辑它们。我建议使用char[]

标签: java string var charat


【解决方案1】:

由于字符串在 Java 中是不可变的 - 字符串操作总是会生成一个新字符串,而将之前的字符串留在字符串池中。 StringBufferStringBuilder 是可变对象,提供字符串操作的方法

下面提供了使用 StringBuilder 的示例工作方法:

static String superReducedString(String s) {
    StringBuilder myName = new StringBuilder(s);
    int j=0;
    for(int i=0;i<s.length()-1;i++) {
        if(s.charAt(i)!=s.charAt(i+1)) {
            myName.setCharAt(j, s.charAt(i));                           
            j++;
        }
    }
    return myName.toString();
}

【讨论】:

    【解决方案2】:

    你不能像sn.charAt(j)=s.charAt(i);那样做这样的赋值,因为charAt()是返回结果的函数,而不是变量。你可以在这里使用StringBuilder

    static String superReducedString(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.length() == i+1 || s.charAt(i) != s.charAt(i + 1)) {
                sb.append(s.charAt(i));
            } else {
                i++;
            }
        }
        return sb.toString();
    }
    

    s.length() == i+1 检查它是否是最后一个字符。如果aabaccr 结果将如预期的那样bar

    【讨论】:

    • 我无法理解 s 的工作原理。 Length() ==i+1 你可以在这里描述一下
    • @Sam 我们有一个从0s.length() 的循环(在aabaccr 的情况下,长度=7)。当s.length() == i+1 给出true 时,这意味着我们位于字符串中最后一个字符的索引上(这是r),我们应该将此字符添加到结果中,因为它没有配对(没有字符在r 之后)。我认为你最好调试你的程序,你可以看到一步一步发生了什么。希望对您有所帮助!
    • @Sam 很高兴为您提供帮助!如果您觉得这很有用,请考虑接受答案
    【解决方案3】:

    答案很简单。 您不能从字符串中删除任何内容,但您可以根据需要将它们移动到另一个 String

    public class Solution {
    
        public static void main(String[] args) {
    
            String s = "abbccd", s1 = "";
    
            if(s.charAt(1) != s.charAt(0))
                s1 += s.charAt(0);
            if(s.charAt(s.length()-1) != s.charAt(s.length()-2))
                s1 += s.charAt(s.length()-1);
    
            for (int i = 1; i < s.length() - 1; i++) {
                if (s.charAt(i) != s.charAt(i - 1) && s.charAt(i) != s.charAt(i + 1))
                    s1 += s.charAt(i);
            }
            System.out.println(s1);
        }
    
    }
    

    您创建另一个字符串。 然后在从1(不是0)到s.length()-1(不是s.length())的for循环中,检查s.charAt(i)(当前字符)是否等于前面或后面的字符。如果它不等于其中任何一个,则将其添加到第二个 String 然后打印它。我们正在检查双方,这就是为什么循环从1s.length()-1,以避免越界异常。

    编辑:检查第一个和最后一个字符。

    【讨论】:

      【解决方案4】:

      只是另一种解决方案,以防其他答案不适合您:

      static String superReducedString(String s) {
          char[] chars = s.toCharArray();
          String lastChar = "";
          ArrayList<String> newString = new ArrayList<>();
          for (char aChar : chars) {
              String currentChar = String.valueOf(aChar);
              if (lastChar.equals(currentChar))
                  newString.remove(newString.size() - 1);
              else {
                  newString.add(currentChar);
                  lastChar = currentChar;
              }
          }
      
          AtomicReference<String> returnString = new AtomicReference<>("");
          newString.forEach(character-> returnString.set(returnString + character));
          return returnString.get();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多