1

プログラムは、最長の昇順を与えることになっています。

したがって、たとえば、「12134707」と入力すると、output = 1347 が返されるはずですが、12 が返されます...これは間違いなく最長ではありません。私は何が欠けているか、間違っていますか?

import java.util.Scanner;        
public class Ascending
{

public static void main(String args[]){

    System.out.print("Enter a number = ");

    Scanner in = new Scanner(System.in);
    String n = in.nextLine();

    //print soluton
    System.out.println("output = " + itsAscending(n));
}

public static String itsAscending(String n) {
    int length = n.length(); 

    String maxlongest = "";


    for(int i = 1; i < length; i++) {

        char first = n.charAt(i-1); 
        char second = n.charAt(i);      
        char next = n.charAt(i+1);
        int f = (int)(first - 48);      
        int s = (int)(second - 48);     
        int nx = (int)(next - 48);

        String longest = "";

        int max = 0;


        //test to find the ascending order
        if (f<s){

            longest = longest + f;

            if(n.length()>2){

                if(f<s){
                    longest = longest + s;
                    length = longest.length();
                    i++;
                }
                else{
                    i++; 
                    continue;
                }
            }

            //test to find the longest string
            for (i=1; i<length; i++){
                if (length > max){
                    max = length;
                    maxlongest = longest;
                    return maxlongest;
                }
                else {
                    return maxlongest;
                }
            }
        }
    }
    return maxlongest;
 }
}
4

7 に答える 7

0

これを試して :

import java.util.Scanner;


public class Ascending {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner = new Scanner ( System.in) ;
    String s = scanner.nextLine();
    String res = getAsc(s);
    System.out.println(res);

}

private static String getAsc (String n) {
    String tmp="" , org="" ;
    char cf,cs;
    int f,s ;
    for (int i=1;i < n.length(); i++) {
        cf = n.charAt(i-1);
        cs = n.charAt(i);
        f = (int) (cf - 48);
        s = (int) (cs - 48 ) ;
        if (f  < s ) {
            tmp += cf ;
        }
        else {
            tmp += cf;
            if (tmp.length() > org.length()) {
                org = tmp ;
            }
            tmp = "";
        }
    }

    return org;
}

}

于 2013-03-18T08:57:36.680 に答える
0

ねえ、多くの場所でコードとロジックを台無しにしています。for ループで長さ変数と比較し、それを変更しています。また、2 番目の for ループは 1 番目のループの中にあります。間違いだと思います。新たに開始して、ロジックと変数をもう一度調べます。長さ変数と i 変数は、複数の場所で使用されますが、代わりに同じものを使用する必要があります。

PS: 私はそれがハードウェアの割り当てであることを知っています:D

于 2013-03-18T08:47:58.037 に答える
0

最大および一時的な文字列を追跡しやすくするために、リストを使用することをお勧めします。

public static String itsAscending(String n) {
    List<Integer> maxLongest = new ArrayList<Integer>();
    List<Integer> tempLongest = new ArrayList<Integer>();

    for(int i = 0; i < n.length(); i++) {
        int digit = (int)(n.charAt(i) - 48);             
        if (tempLongest.size() > 0 && digit < tempLongest.get(tempLongest.size() - 1)) {
            tempLongest.clear();
        }
        tempLongest.add(digit);
        if (tempLongest.size() > maxLongest.size()) {
            maxLongest.clear();
            maxLongest.addAll(tempLongest);
        }
    }
    String returnString = "";
    for (int digit : maxLongest){ 
        returnString += digit;
    }
    return returnString;
}
于 2013-03-18T09:04:16.170 に答える
0

いくつかのメモ:

  • char を int に変換する必要はありません。char は同等です。
  • 整数式を にキャストする必要はありませんint
  • 「最長の文字列を見つけるためのテスト」ループは無意味に思えます。最初の反復で無条件に戻ります。
  • 最初のループの下部に向かって、i無条件にインクリメントします。ifそれはステートメントの外で起こるべきです。
  • どこnextにも使用しない変数があります。
  • あなたの変数は冗長です: それは単なる文字列lengthの長さです.longest

これらすべての問題があるため、コードを機能させるために変更できるコード内の 1 つのポイントを見つけようとするよりも、ゼロから始める方がはるかに簡単です。だからここに私が得たものがあります:

public static void main(String[] args) {
    System.out.print("Enter a number = ");
    String in = new Scanner(System.in).nextLine();
    System.out.println("output = " + longestAscending(in));
}

static String longestAscending(String in) {
    int startOfLongest = 0;
    int endOfLongest = 0;
    for (int start = 0; start < in.length();) {
        int end = start;
        for (int prevChar = -1;
             end < in.length() && in.charAt(end) > prevChar;
             prevChar = in.charAt(end), end++)
        { }
        if (end - start > endOfLongest - startOfLongest) {
            startOfLongest = start;
            endOfLongest = end;
        }
        start = end;
    }
    return in.substring(startOfLongest, endOfLongest);
}
于 2013-03-18T09:07:35.037 に答える
0

機能をさまざまな機能に分割して、コードをよりシンプルにすることをお勧めします。

文字列を解析します。

public static int[] parseString(String str) {
    int[] result = new int[str.length];
    for (int i = 0; i < str.length; i++) {
        result[i] = (int)(str.charAt(i) - 48);
    }
    return result;
}

問題を解く:

public static String solve(String str) {
    int[] a = parseString(str);
    int length = 1;
    int maxStart = 0;
    int start = 0;
    for (int i = 1; i < a.length; a++) {
        if (a[i] <= a[i-1]) {
            if (length < (start - i)) {
                length = start - i;
                maxStart = start;
            }
            start = i;
        }
    }
    return str.substring(maxStart, maxStart+length);
}

これは空でない文字列に対してのみ機能しますが、自分で修正できると思います...

于 2013-03-18T08:48:52.703 に答える
0

2 番目のループで:

    //test to find the longest string
    for (i=1; i<length; i++){
        if (length > max){
            max = length;
            maxlongest = longest;
            return maxlongest;
        }
        else {
            return maxlongest;
        }
    }`

いずれかifが実行されるかelse実行されますが、どちらの場合も実行されますreturn。したがって、2 番目のforループは複数回実行されず、最初のループも終了します。
2 番目のループを削除して、その中のステートメントを返すことができます。
そして、もう一度チェックする理由はありませんif(f<s)

于 2013-03-18T08:56:07.453 に答える