1. 程式人生 > >華為2018校招第二題 求去重後的最大整數

華為2018校招第二題 求去重後的最大整數

如:

輸入:234432

輸出:432

程式碼如下:

package test2;

import java.util.Collections;

import java.util.Map;

import java.util.Scanner;

import java.util.TreeMap;

import java.util.TreeSet;

publicclass Main5 {

// 華為機試第二題,取消重複數字後的最大數,比如輸入的是:423234,輸出是:432

public static void main(String[] args) {

Scanner sc = new

Scanner(System.in);

TreeSet<Integer> set = new TreeSet<Integer>();

String[] strArr ;

int k = 0;

Long maxNum = 0L;

int st = 0;

TreeMap<Long, Boolean> map = new TreeMap<Long, Boolean>();

while(sc.hasNext()){

String line = sc.nextLine();

/*

* 思路:

* 1、首先將字串去重後得到的數放入一個大小小於10的陣列中;

* 2、枚舉出所有由這些數字組成的數;

* 3、將這些數放入TreeSet集合中;

* 4、遍歷TreeSet集合,判斷元素是否在原始串中出現過,若沒出現則將其刪除;

* 5、最後取出TreeSet中最後一個元素就是最大整數。

* */

// 1、首先將字串去重後得到的數放入一個大小小於10的陣列中;

for(int i=0 ; i<line.length() ; i++){

set.add(Character.getNumericValue(line.charAt(i)));

}

strArr = new String[set.size()];

for (Integer in : set

) {

strArr[k] = in + "";

k++;

}

// 2、枚舉出所有由這些數字組成的數;3、將這些數放入TreeSet集合中;

permutate(strArr, st, map);

// 4、遍歷TreeSet集合,判斷元素是否在原始串中出現過,若沒出現則將其刪除;

for (Map.Entry<Long, Boolean> entry: map.entrySet()) {

Long key = entry.getKey();

boolean isFind = findStrByKey(line, key);

if(isFind){

map.put(key, true);

}

}

// 5、最後取出TreeMap中最後一個元素就是最大整數。

for (Map.Entry<Long, Boolean> entry: map.entrySet()) {

if(entry.getValue()){

maxNum = entry.getKey();

}

}

System.out.println(maxNum);

}

}

private static boolean findStrByKey(String line, Long key) {

String keyStr = key.toString();

String[] temp = new String[keyStr.length()];

int k = 0;

int j = 0;

for (int i = 0; i < keyStr.length(); i++) {

temp[i] = keyStr.charAt(i) + "";

//temp[i] = Character.getNumericValue(keyStr.charAt(i)) +"";

}

while(k<temp.length){

while(j<line.length()){

if(temp[k].equals(line.charAt(j)+"")){

k++;

j++;

break;

}

j++;

}

if(j==line.length()){

break;

}

}

// 最終判斷k是否到達末尾就可知存不存在;

if(k==temp.length){

returntrue;

}

returnfalse;

}

public static void permutate(String[] strArr, int st, TreeMap<Long, Boolean> map){

if(st == strArr.length-1){

// 將當前字串陣列表示的整數存入set。

StringBuilder sb = new StringBuilder();

// 列印當前字串

for (int i = 0; i < strArr.length; i++) {

String string = strArr[i];

//System.out.print(string + "");

sb.append(string);

}

//System.out.println();

String s = sb.toString();

map.put(new Long(s), false);

}else {

for(int i=st ; i<strArr.length ; i++){

swap(strArr, i, st);

permutate(strArr, st + 1, map);

swap(strArr, i, st);

}

}

}

private static void swap(String[] strArr, int i, int st) {

String temp = strArr[i];

strArr[i] = strArr[st];

strArr[st] = temp;

}

}

如發現問題,歡迎留言!