求一个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.Arrays;
import java.util.List;
import java.util.Scanner;

//1找到递减数
//2找递减数中最大的
//3找到递减数中各位数和最大的数
//返回结果
public class Main {

	public static void main(String[] args) {
		// 数据输入 消除负数 把正整数转化成charArray便于处理
		Scanner in = new Scanner(System.in);
		int inputNumber = in.nextInt();
		inputNumber = Math.abs(inputNumber);
		char[] inputNumbers = (inputNumber + "").toCharArray();

		List<Integer> decreasingNumbers = findDecreasingNumbers(inputNumbers);

		// 封装异常输入
		if (decreasingNumbers.size() == 0) {
			System.out.println(0);
			return;
		}
		Integer[] decreasingNumbersArray = decreasingNumbers
				.toArray(new Integer[0]);
		Arrays.sort(decreasingNumbersArray);

		int maxDecreasingNumber = decreasingNumbersArray[decreasingNumbersArray.length - 1];
		int decreasingNuberWithMaxNumberSum = getDecreasingNuberWithMaxNumberSum(decreasingNumbersArray);
		int sum = maxDecreasingNumber + decreasingNuberWithMaxNumberSum;
		System.out.println(sum);
	}

	// 找到所有递减数
	// 这里用char去存取数字 所以赋给Integer的时候需要减掉48
	public static List<Integer> findDecreasingNumbers(char[] inputNumbers) {
		ArrayList<Integer> decreasingNumbers = new ArrayList<Integer>(20);

		// 存放中间数据
		ArrayList<Integer> cache = new ArrayList<Integer>(20);
		cache.add(inputNumbers[0] - 48);

		for (int i = 1; i < inputNumbers.length; i++) {
			if (inputNumbers[i] < inputNumbers[i - 1]) {
				// 如果满足递减规则 那么与前一位构成递减数的字符串也能满足
				for (int j = 0; j < cache.size(); j++) {
					cache.set(j, cache.get(j) * 10 + inputNumbers[i] - 48);
					decreasingNumbers.add(cache.get(j));
				}
			} else {
				cache.clear();
			}
			cache.add(inputNumbers[i] - 48);
		}
		decreasingNumbers.trimToSize();
		return decreasingNumbers;
	}

	// 这边预定义一下 如果存在多个各位数和最大的递减数 那么我们将返回最大的结果
	// 输入是一个 不为空的有序正数集
	public static int getDecreasingNuberWithMaxNumberSum(
			Integer[] decreasingNumbersArray) {
		int result = 0;
		int maxSum = 0;
		int temp = 0;
		for (int i = 0; i < decreasingNumbersArray.length; i++) {
			temp = getNumberSum(decreasingNumbersArray[i]);
			if (maxSum > temp) {
				continue;
			} else {
				maxSum = temp;
				result = decreasingNumbersArray[i];
			}
		}
		return result;
	}

	// 返回各位数字的和
	private static int getNumberSum(int inputInteger) {
		int result = 0;
		while (inputInteger > 0) {
			result += inputInteger % 10;
			inputInteger /= 10;
		}
		return result;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值