[题目描述]
给定一个整数,给出消除重复数字以后最大的整数
输入描述 :正整数,注意考虑长整数
输出描述 : 消除重复数字后的最大整数
[示例1]
输入 : 423234
输出 : 432
[思路]
使用栈作为辅助工具,首先从前往后遍历数组
* 栈为空就压入栈
* 栈非空,判断当前数组元素是否大于栈顶元素
* 是 , 判断栈顶元素是否在后面的数组中存在,如果存在就弹出栈顶元素
* 判断栈中是否已经存在当前数组元素,否,将当前数组元素压入栈
[参考]
http://www.cnblogs.com/pk28/p/7421214.html
[代码]
public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); char[] inputCharArray = in.nextLine().toCharArray(); int size = inputCharArray.length; int[] inputArray = new int[size]; //处理输入数据 for (int i = 0; i < size; i++) { inputArray[i] = inputCharArray[i] - ‘0‘; } Stack numberStack = new Stack(); for (int i = 0; i < size; i++) { if(numberStack.isEmpty()){ numberStack.push(inputArray[i]); }else { int currentNumber = inputArray[i]; int stackTop = (int)numberStack.peek(); if(currentNumber > stackTop){ boolean isExistForward = findIfExistForward(inputArray, stackTop, i + 1, size - 1); if(isExistForward){ numberStack.pop(); } } boolean isExistInStack = findIfExistBackward(numberStack, currentNumber); if(!isExistInStack){ numberStack.push(currentNumber); } } } for (int i = 0; i < numberStack.size(); i++) { System.out.print(numberStack.get(i)); } } /** * 判断inputCharArray数组中,下标从i到(length-1)是否有currentNumber的重复元素 * @param inputCharArray 源数组 * @param currentNumber * @param i * @param end */ private static boolean findIfExistForward(int[] inputCharArray, int currentNumber, int i, int end) { while (i <= end){ if(inputCharArray[i] == currentNumber){ return true; } i++; } return false; } /** * 判断栈中,是否已存在currentNumber元素 * @param numberStack * @param currentNumber * @return */ private static boolean findIfExistBackward(Stack numberStack, int currentNumber) { if(numberStack.search(currentNumber) == -1){ return false; }else { return true; } }}
[测试用例]
1、输入 : 423234 输出 : 432
2、输入 : 432143214321 输出 : 4321
3、输入 : 42189214 输出 : 42891
时间: 2024-08-05 18:32:18