求一个int型整数的两种递减数之和 | |
描述: | 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数;2.递减数中各位数之和最大的数)之和。
|
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: | 一个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;
}
}