Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

最長かつ辞書の順で一番若くなるような回文を出力するコードを書いています

https://paiza.jp/poh/joshibato/matsue-ruby
こちらのページの課題に今取り組んでおります
一通り書いてみたものの期待する出力がされません
いかがコードです
私の考え方は単語を数字に変えて比較することで、辞書の順に並べよ
うと考えました
おそらくうまくいってないのはmakenumberメソッドだと思います
どのようにすればうまくいくのでしょうか??







import java.util.Scanner;

class Main{

    static String reverse(String s){
        String a = "";
        for(int i = s.length() - 1;i >= 0;i--)
            a += s.substring(i,i + 1);
        return a;
    }

    static int number(String a){
        switch(a){
        case "A":
            return 1;
        case "B":
            return 2;
        case "C":
            return 3;
        case "D":
            return 4;
        case "E":
            return 5;
        case "F":
            return 6;
        case "G":
            return 7;
        case "H":
            return 8;
        case "I":
            return 9;
        case "J":
            return 10;
        case "K":
            return 11;
        case "L":
            return 12;
        case "M":
            return 13;
        case "N":
            return 14;
        case "O":
            return 15;
        case "P":
            return 16;
        case "Q":
            return 17;
        case "R":
            return 18;
        case "S":
            return 19;
        case "T":
            return 20;
        case "U":
            return 21;
        case "V":
            return 22;
        case "W":
            return 23;
        case "X":
            return 24;
        case "Y":
            return 25;
        case "Z":
            return 26;
        case "a":
            return 1;
        case "b":
            return 2;
        case "c":
            return 3;
        case "d":
            return 4;
        case "e":
            return 5;
        case "f":
            return 6;
        case "g":
            return 7;
        case "h":
            return 8;
        case "i":
            return 9;
        case "j":
            return 10;
        case "k":
            return 11;
        case "l":
            return 12;
        case "m":
            return 13;
        case "n":
            return 14;
        case "o":
            return 15;
        case "p":
            return 16;
        case "q":
            return 17;
        case "r":
            return 18;
        case "s":
            return 19;
        case "t":
            return 20;
        case "u":
            return 21;
        case "v":
            return 22;
        case "w":
            return 23;
        case "x":
            return 24;
        case "y":
            return 25;
        case "z":
            return 26;
        default:
            return 0;



        }

    }
    static int makenumber(String s){
        int n = 1;
        int x = 0;

        for(int i = s.length() - 1;i >= 0;i--){
 
            x += number(s.substring(i,i+1)) * n;
            n *= 100;
        }
        System.out.println(x);
        return x;
    }

    public static void main(String[] args){

        Scanner stdIn = new Scanner(System.in);


        int n = stdIn.nextInt();
        String[] s = new String[n];
        String[] r = new String[n];
        int[] be = new int[n];                //        反転さ
せた文字列が存在する場合は1または-1、存在しない場合は0
        int min =  0;
        int[] same = new int[n];
        int[] good = new int[n];            //        その文
字列自体が回文の場合1,違う場合そのまま0
        int[] sort = new int[n];
        int count = 0;
        int minnumber = -1;                    //        
minnumberはその文字列自体が回文である文字列のなかでsortが一
番小さい文字列番号
        int reversenumber = 0;

        for(int i = 0;i < n;i++){
            s[i] = stdIn.next();
            r[i] = reverse(s[i]);
        }


            //            i番目の文字列が南番目の文字列を
反転した文字列かを調べる
        for(int i = 0;i < n;i++)
            for(int j = i;j < n;j++){
                if(s[i].equals(r[j]) && i != j){
                    same[i] = j;
                    be[i] = 1;
                    be[j] = -1;
                }
                else
                    same[i] = -1;
            };

            //            i番目の文字列自体が回文かどうか
を調べる
        for(int i = 0;i < n;i++){
            for(int j = 0;j <= s[0].length() / 2 - 1;j++){
            if(s[j].substring(j,j+1).equals(s[j].substring(n-j,n-
j+1)))
                good[i]++;
            else break;
            }
            if(good[i] == s[0].length() / 2)
                good[i] = 1;
            else
                good[i] = 0;
        }



        for(int i = 0;i < n;i++){
            if(be[i] == 1){
                sort[i] = makenumber(s[i]);
                sort[same[i]] = makenumber(s[same[i]]);
                if(sort[i] > sort[same[i]])    {
                    s[i] = s[same[i]];
                    sort[i] = sort[same[i]];


                }
                reversenumber++;



            }
            if(good[i] == 1 && be[i] == 0){
                sort[i] = makenumber(s[i]);
                if(count == 0){
                    min = sort[i];
                    minnumber = i;
                }

                if(sort[i] < min){
                    min = sort[i];
                    minnumber = i;
                }
                count = 1;
            }
        }
        

        int[] img_sortnumber = new int[reversenumber];
        int[] real_sortnumber = new int[reversenumber];
        count = 0;

        for(int i = 0;i < n;i++){
            if(be[i] == 1){
                img_sortnumber[count] = i;                
//img_sortnumber[]には文字列の番号が代入されている
                count++;
            }


        }
        for(int i = 0;i < reversenumber;i++){            //iは
            for(int j = 0;j < reversenumber;j++){
                if(sort[img_sortnumber[i]] > 
sort[img_sortnumber[j]])
                    real_sortnumber[i]++;                
//real_sortnumber[]には文字列の順位が代入されている

            }

        }
        String answer = "";

        for(int i = 0;i < reversenumber;i++){
            for(int j = 0;j < reversenumber;j++){
                if(i == real_sortnumber[j])
                    answer += s[img_sortnumber[j]];

        }


        }
        if(minnumber != -1)
        answer += s[minnumber];

        for(int i = 0;i < reversenumber;i++){
            for(int j = reversenumber - 1;j >= 0;j--)
                if(i == real_sortnumber[j])
                    answer += s[img_sortnumber[j]];
            }
            if(n >= 1 && n <= 1000 && s[0].length() >= 1 && 
s[0].length() <= 10)
            System.out.print(answer);
        }
}

1

回答

3544

閲覧

1件の回答

評価

0

makenumber()が怪しいと思うなら、ある文字列を与えた
ときにどんな数字が出れば正しいのか、紙の上で計算し
て、試してみることだ。


さて、答えではないが。
頭をひねって、短いコードで同じ結果を実現するのも、
プログラマとして必要なことだ。
簡潔に書くことができれば、バグが混入する可能性が減
る。混入しても見つけやすくなる。
その分、ほかの箇所に目が届きやすくなる。
例えば最初の2メソッドは、以下で同じ結果が得られ
る。

static String reverse(String s){
    return new 
StringBuilder(s).reverse().toString();
}
static int number(char c){
    return('A'<=c && c<='Z') ? c-'A'+1 : ('a'<=c 
&& c<='z') ? c-'a'+1 : 0;
}
後者は文字コードの知識が必要だし、使っていい場合悪
い場合の判断もできないが。

substring()は考えやすくて他の言語との親和性も高い
が、charAt()やtoCharArray()といったメソッドとの使
い分けができるようになるといいぞ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。