程序应该提供最长的升序。
所以,例如,如果我输入“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 :(得分:0)
嘿,你搞砸了代码&amp;许多地方的逻辑。您正在与for循环中的长度变量进行比较并对其进行修改。你的第二个循环也在第一个循环中。我认为这是一个错误。重新开始你的逻辑和变量再次..你的长度变量&amp; i变量用于多个地方,而应使用相同的腼腆。
P.S:我知道它的硬件任务:D
答案 1 :(得分: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);
}
这只适用于非空字符串,但我认为你可以自己解决这个问题......
答案 2 :(得分: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)
。
答案 3 :(得分: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;
}
}
答案 4 :(得分: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;
}
答案 5 :(得分: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);
}
答案 6 :(得分:0)
一个类似的问题和我的解决方案。该解决方案也可以适用于解决OP解决方案
字母数字字符串中最长的升序序列 编码问题:
想象您正在工作,并且被赋予编写一个将在我们的一种产品中使用的功能的任务。
第1部分)用您选择的编程语言(您应该在答案中命名),编写一个函数,该函数将文本字符串作为其单个输入并返回一个整数,该整数是最长的升序数字序列的长度在字符串中找到。任何非数字字符都将终止数字序列,但否则应忽略。
第2部分)您想要使用哪些测试用例来测试您的功能,以证明其正常工作?为什么?给出测试输入字符串和预期输出的具体示例。
例如:
如果输入字符串为“ 5123a4”,则输出整数应为3,因为序列“ 123”是最长的升序序列,长度为3。
如果输入字符串为“ bb54324687cc”,则输出整数应为4,因为序列“ 2468”是最长的升序序列,长度为4。
打包com.company;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
公共类主要{
public static void main(String[] args) {
// write your code here
System.out.print("Enter a number = ");
Scanner in = new Scanner(System.in);
String n = in.nextLine();
System.out.println("n = "+n);
longestAscending(n);
//n = "bb54324687cc";
}
public static Hashtable<String,Integer>longestAscending(String n) {
Hashtable<String,Integer> h= new Hashtable<String, Integer>() ;
String tempMax ="";
int lenghtString=0;
System.out.println("n.length()-1="+(n.length()-1));
// int digit = 0;
for (int i=0; i<=n.length()-2;i++)
{
int homePositionDigit = (int)(n.charAt(i) - 48);
int neighbourPositionDigit = (int)(n.charAt(i+1) - 48);
System.out.print(" i = "+i +" homePositionDigit ="+(n.charAt(i)-48));
System.out.println(" neighbourPositionDigit ="+(n.charAt(i+1)-48));
if ((homePositionDigit <=9 )&& (neighbourPositionDigit<=9))
{
if (n.charAt(i)<n.charAt(i+1))
{
tempMax=tempMax+n.charAt(i);
lenghtString=tempMax.length();
h.put(tempMax,lenghtString);
System.out.println("hash table h="+h);
}
}
else
if ((homePositionDigit>9)&&(tempMax!="")&&((n.charAt(i-1)-48)<=9))
{
tempMax=tempMax+n.charAt(i-1);
lenghtString=tempMax.length();
h.put(tempMax,lenghtString);
tempMax="";
lenghtString=0;
}
}
System.out.println("hash table h="+h);
Iterator<Map.Entry<String,Integer>> it = h.entrySet().iterator();
int kontor=0,max=0 ;
while (it.hasNext()) {
Map.Entry<String,Integer> entry = it.next();
if (kontor==0)
max=entry.getValue();
System.out.println("max este = "+max+" entry.getValue()= "+entry.getValue());
if (entry.getValue() > max ) {
max=entry.getValue();
}
kontor++;
}
System.out.println("max este "+max);
System.out.println("hash table este "+h);
it=h.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String,Integer> entry = it.next();
if (max==entry.getValue()) {
System.out.println("the longest sequence of ascending digits in a String is = " + entry.getKey()+" and has the lenght of= "+max );
}
}
return h;
}
}