2017-08-23 华为笔试第二道编程题详解
[题目描述]
给定一个整数,给出消除重复数字以后最大的整数
输入描述 :正整数,注意考虑长整数
输出描述 : 消除重复数字后的最大整数
[示例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