5

文字列圧縮の for ループが少しずれています。私は過去 5 日間この課題に取り組んできましたが、何が悪いのか一生わかりません。誰かが私を助けることができますか?

たとえば、文字列を渡したところ、"TTTTrrrEe"を取得する代わりに を取得T4r3EeしていT4r3EeTTます。なぜそのように文字列の先頭に戻るのかはわかりませんが、近づいています。文字列クラスのcharAtequalslength、およびのみを使用できます。substring

誰かが私の論理を修正するのを手伝って、私を正しい方向に導くのを手伝ってくれますか? 私はまだこれを自分でコーディングしてみたいと思っています。

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)条件は不要になります。fori < s.length()-1
  • 部分文字列を比較するよりも、個々の文字を比較するほうが簡単 (かつ高速) です。iを呼び出してその位置の文字を取得し、char ch1 = s.charAt(i)2 つの文字を==呼び出すのではなく、演算子を使用して比較equals()します。
  • countがゼロの場合 (条件count < 1は と同等count == 0)、最初の文字に加えて、現在の文字とその後の文字の両方をtemp出力します。これは正しくないようです。
  • tempループを通過するにつれて成長するのではなく、反復ごとに設定します。これは正しくないようです。
  • tempループを通過するにつれて成長するより良い方法は、単純な を使用する代わりにStringBuilderandを使用し、連結を実行することです。append()String
于 2013-09-11T13:39:09.637 に答える
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 に答える
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 に答える