华为2018校招第二题 求去重后的最大整数

本文介绍了一种算法,该算法用于从给定的数字串中移除重复数字并找出最大的可能组合。通过使用TreeSet和TreeMap等数据结构,确保了结果的正确性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如:

输入:234432

输出:432


代码如下:


package test2;


import java.util.Collections;

import java.util.Map;

import java.util.Scanner;

import java.util.TreeMap;

import java.util.TreeSet;


public class 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){

return true;

}

return false;

}


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;


}




如发现问题,欢迎留言!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值