欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

给定正整数N和集合K,求不大于N的,且每一位数字都在K中的最大值M,比如N=297,K={2,5,8},则返回288

程序员文章站 2022-03-21 23:19:09
...

思想:从高到低位开始排,在序列中找遇到有相等的,就加到M*10(往左移一位)中,一直进行这样的循环;直到没有相等的,就取当前位的前一位,自此之后的所有位数都取数组K中最大的数。

代码:

import java.util.Arrays;
import java.util.Scanner;

public class MaxM {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int[] K = {2,5,8};
		Arrays.sort(K);
		
		int M = 0;
		int flag=0;
		String sn = N+"";
		for(int i=0;i<sn.length();i++){
			int n = (int)sn.charAt(i)-48;
			for(int j=0;j<K.length;){
				if(n>K[j]){
					j++;
				}else if(n==K[j]){
					M = M*10 + n;
					break;
				}else{
					flag = 1;//当遇到没有相等的时候,设flag=1
					M = M*10 + K[j];
					break;
				}
			}
			while(flag == 1 && i++<sn.length()){//flag为1时,对其后所有的位都取集合中最大的数
				M = M*10 + K[K.length-1];
			}
		}
		System.out.println(M);
	}
	
}