2013-03-18 5 views
0

프로그램은 가장 긴 오름차순을 제공합니다.문자열에서 가장 긴 오름차순 숫자 시퀀스 찾기

예를 들어, "12134707"을 입력하면 출력 = 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; 
} 
} 
+0

숙제에 문제가 있습니까? – Anubhab

+4

나는 무엇이 잘못되었는지 그리고 어디에 있는지 찾아 내기 위해 코드를 디버깅 할 것을 제안한다. –

+2

@Anubhab가 중요합니까? 그것은 나에게 그가 노력을 기울 였고 틀린 한 가지를 찾을 수없는 것 같습니다. 그럼 왜 그가 여기 묻지 않았을까요? – Joetjah

답변

0

안녕하세요. 많은 곳에서 코드 &을 엉망으로 만들고 있습니다. for 루프에서 length 변수와 비교하고 수정합니다. 또한 두 번째 루프는 첫 번째 루프 안에 있습니다. 나는 그 실수라고 생각한다. 당신의 논리를 다시 새롭게 시작하십시오. & 변수들 .. 길이 변수 & i 변수는 같은 장소의 꼬인 대신 여러 장소에서 사용됩니다.

PS : 나는 그것에게 HW 할당 알고 : D를

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); 
} 

이것은 비어 있지 않은 경우에만 작동합니다. PTY 문자열,하지만 난 당신이 해결할 수 있습니다 가정 두 번째 루프에서

0

... 자신이 :

//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을 것이다. 두 번째 for 루프가 두 번 이상 실행되지 않고 첫 번째 루프가 종료됩니다.
두 번째 루프 및 return 문을 제거 할 수 있습니다.
if(f<s)을 다시 확인할 이유가 없습니다.

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; 
} 

}

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; 
} 
0

일부 노트 :

  • 당신의 int로 문자를 변환 할 필요가 없습니다 : 문자는 비교할;
  • 정수 표현을 int으로 변환 할 필요가 없습니다.
  • "가장 긴 문자열 찾기"루프는 무의미한 것처럼 보입니다. 첫 번째 반복에서는 무조건 돌아갑니다.
  • 첫 번째 루프의 맨 아래로 +1하면 i이 무조건 증가합니다. 이는 if 문 외부에서 발생해야합니다.
  • 아무데도 사용하지 않는 변수가 next입니다.
  • length 변수가 중복되었습니다. 길이는 longest 문자열의 길이입니다.

이러한 모든 문제로 인해 처음부터 시작하는 것이 코드에서 작동하도록 변경 될 수있는 단일 지점을 찾으려고 시도하는 것보다 훨씬 쉽습니다. 그래서 여기에 내가 무엇을 가지고 있습니다 :

static String in; 
public static void main(String args[]) { 
    System.out.print("Enter a number = "); 
    in = new Scanner(System.in).nextLine(); 
    System.out.println("output = " + longestAscending(0, "")); 
} 
static String longestAscending(int start, String longest) { 
    if (start >= in.length()) return longest; 
    int prev, i; 
    for (i = start, prev = 0; i < in.length() && in.charAt(i) > prev; 
     prev = in.charAt(i++)); 
    return longestAscending(i, 
      i - start > longest.length()? in.substring(start, i) : longest); 
} 
관련 문제