2013-03-18 89 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 2013-03-18 08:24:57

+4

我建议你调试代码,以找出哪里出了问题,在哪里。 – 2013-03-18 08:25:39

+2

@Anubhab有那么重要吗?在我看来,他已经付出了努力,并且找不到错误的一件事。那么他为什么不在这里问它呢? – Joetjah 2013-03-18 08:26:20

回答

0

嘿嘿你在很多地方弄乱了代码&逻辑。您正在比较for循环中的长度变量并对其进行修改。你的第二个循环也在第一个循环内。我认为这是一个错误。开始新鲜再次通过你的逻辑&变量..你的长度变量&我变量在多个地方使用,而应该使用相同的co of。

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

这只适用于非em 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循环将不会执行多次,也会导致终止第一个循环。
您可以删除第二个循环并返回其中的语句。
而且没有理由再次检查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;
  • 你的“测试找到最长的字符串”循环似乎毫无意义:你在第一次迭代中无条件返回;
  • 朝向第一个循环的底部,无条件地增加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); 
}