求一个int型整数的两种递减数之和

求一个int型整数的两种递减数之和
描述:

给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数;2.递减数中各位数之和最大的数)之和。


递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况。


最大递减数:所输入整数的所有递减数中值最大的一个。 如: 75345323,递减数有:75,753,53,53,532,32。那么最大的递减数为753。


各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7+5+3=15),53各位数之和=8(5+3=8),532各位数之和=10(5+3+2=10),32各位数之和=5(3+2=5)。那么各位数字之和最大的递减数为753。


输出结果=最大递减数+各位数之和最大的递减数。(1506=753+753)

运行时间限制: 无限制
内存限制: 无限制
输入:

一个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来动态存储数据。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值