求一个int型整数的两种递减数之和 | |
描述: | 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数;2.递减数中各位数之和最大的数)之和。 |
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: | 一个int型整数。如:75345323 |
输出: | 一个int型整数。如:1506
|
样例输入: | 75345323 |
样例输出: | 1506 |
|
|
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
public static void main(String []args){
Scanner sc=new Scanner(System.in);
//System.out.println("请输入一个数字:");
while(sc.hasNext()){
int max1=0,max2=0,max3=0;
ArrayList <Integer>a=new ArrayList<Integer>();
int a1=sc.nextInt();
int b=Math.abs(a1);
String s=Integer.toString(b);
//char[] c=s.toCharArray();
for(int i=0;i<s.length()-1;i++){
for(int j=i;j<s.length()-1;j++){
String subStr=s.substring(i,j+2);
if(isDecrease(subStr)){
int c=Integer.parseInt(subStr);
a.add(c);
}
}
}
for(int k=0;k<a.size();k++){
if(max1<a.get(k)){
max1=a.get(k);
}
int sum1=0;
char c2[]=a.get(k).toString().toCharArray();
for(int l=0;l<c2.length;l++){
sum1+=Integer.parseInt(Character.toString(c2[l]));
}
if(sum1>max2){
max2=sum1;
max3=a.get(k);
}
}
int max=max1+max3;
System.out.println(max);
}
sc.close();
}
static boolean isDecrease(String s){
char[] c=s.toCharArray();
boolean b=true;
for(int i=1;i<c.length;i++){
if(c[i]>=c[i-1]){
b=false;
}
}
return b;
}
}
本题总结:思路为暴力遍历,即将输入数字的所有可能组合全部列出,然后用判断递减数的函数来判断。
解题过程中出错的地方:
①java中字符可以直接按ASCII码比较大小,即若char c=1; char b=2; 可以比较b和c的大小,但是若int a=b+c;(b和c的1、2来自于字符串拆分)则b的值为1和2的ASCII码值的和,即48+50。在解题时,最好不直接把字符相加减。
②String的substring(i,j)方法是截取[i,j)的一段子子字符串。故本题若要判断字符串中数字是否递减,至少应取j=i+2。
③将String类型转换为int型,应该用Integer.parseInt(String s)而不是Integer.getInteger(String nm)。
④因为不确定有多少数据,用ArrayList来动态存储数据。