5

我的字符串压缩的 for 循环有点偏离。在过去的 5 天里,我一直在做这项任务,但我一生都无法弄清楚出了什么问题。有人可以帮我吗?

例如,我传递了字符串"TTTTrrrEe",而不是得到T4r3Ee,我得到T4r3EeTT。我不知道为什么它会像那样跳回到字符串的开头,但我越来越近了。我们只能使用charAt, equals, length, andsubstring

有人可以通过帮助纠正我的逻辑来帮助我朝着正确的方向前进吗?我仍然想尝试自己编写代码,看看它是如何分配的。

public static String compress(String s){
    int count = 0;
    String temp = s.substring(0,1);
    for(int i = 0; i < s.length(); i++){
        if(i !=s.length()-1){
            if(temp.equals(s.substring(i,i+1))){
                count++;

            }else{

                if(count < 1){
                    System.out.print(s.substring(i,i+2));
                    System.out.print(temp.substring(0,1) );
                }else{
                    System.out.print("" + temp.substring(0,1) + count);
                    i--;
                    temp = s.substring(count,count+1);
                    System.out.println(" temp is now " + temp);

                    count = 0;
                    //i--;
                }
            }
        }

    }

    System.out.println(temp);

    return temp;
}
4

6 回答 6

3

由于这是一个学习练习,我不会尝试修复您的代码,只需指出一些需要做的事情以使其正确:

  • if (i !=s.length()-1)如果您将循环for条件更改为i < s.length()-1
  • 比较单个字符比比较子字符串更容易(也更快)。i您可以通过调用来获得位置上的字符char ch1 = s.charAt(i),并使用运算符比较两个字符==,而不是调用equals()它们。
  • Whencount为零(您的count < 1条件相当于count == 0),除了第一个字符temp后跟计数之外,您还打印当前字符和它之后的字符。这看起来不正确。
  • 不是temp在循环中增长,而是在每次迭代中设置它。这看起来不正确。
  • 在循环中增长的更好方法temp是使用StringBuilderand append(),而不是使用普通的String, 并执行连接。
于 2013-09-11T13:39:09.637 回答
0

temp = s.substring(count,count+1);位置( i) 无关,而是与大小有关。

事实上,我会尝试用外部合理的名称重新重写它:

char repeatedChar = `\u0000`; // Not present.
int repetitions = 0;

因为无名氏count,你遇到了麻烦。

于 2013-09-11T13:44:35.603 回答
0

尝试使用这样的逻辑;

int count = 0;
for(int i =0; i < string.length()-1; i++){
    if(string.charAt(i) == string.charAt(i + 1)){
        count++;
        // DO SOME OPERATION
    }
}
于 2013-09-11T13:39:14.170 回答
0

String temp = s.substring(0,1);

temp.equals(s.substring(i,i+1))

对于这两个句子,您应该使用 achar而不是 String,如下所示:

char temp = s.charAt(0)

temp == s.charAt(i)

我将从 3 个变量开始:

char lastCharacter = inputString.charAt(0); int count = 1; String result = "";

然后继续循环处理输入字符串:

if (length <= 1) return inputString;
for i = 1 ; i < length;i++
    if (inputString.charAt(i) == lastCharacter && i != length-1)
        count++
    else
        if count == 1 
            result += lastCharacter
        else 
            result = result + lastCharacter + count;
            count = 1;
        end if
        lastCharacter = inputString.charAt(i);
    end if
end for
return result;
于 2013-09-11T13:50:54.127 回答
0

工作代码:

public  class HelloWorld  {

public static void compress(String s){

    StringBuilder buff = new StringBuilder();

    char tmp = '\0';

    int index = 1;

    for(int i = 0; i < s.length(); i++){

        char curr = s.charAt(i);            

        if(buff.length() == 0){             
            tmp = curr;
            buff.append(tmp);
            continue;
        }           

        if(curr == tmp){
            index++;
        }
        else{                   
            if(index > 1){
                buff.append(index);
                index = 1;
                tmp = curr;
            }

            buff.append(curr);              
        }


    }

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

}


public static void main(String args[]){
    compress("TTTTrrrEe");
}
 }

输出: T4r3Ee

为了compress("TTsssssssssssTTrrrEe");

输出:T2s11T2r3Ee

于 2013-09-11T13:47:47.877 回答
0

尝试这个

    public class Compress {

        /**
         * @param args
         * @author Rakesh KR
         */
         public static String encode(String source) {
                StringBuffer dest = new StringBuffer();
                for (int i = 0; i < source.length(); i++) {
                    int runLength = 1;
                    while (i+1 < source.length() && source.charAt(i) == source.charAt(i+1)) {
                        runLength++;
                        i++;
                    }
                    dest.append(source.charAt(i));
                    dest.append(runLength);
                }
                return dest.toString();
            }

        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String example = "aaaaaaBBBBccc";
            System.out.println("Encode::"+encode(example));
        }

    }
于 2013-09-11T13:47:48.750 回答