import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.HashMap;

/**

* @Author: coderjjp

* @Date: 2020-05-08 10:18

* @Description: 选靓号

* @version: 1.0

*/

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String[] s = br.readLine().split(" ");

int N = Integer.valueOf(s[0]);

int K = Integer.valueOf(s[1]);

char nums[] = br.readLine().toCharArray();//原始号码

int hash[] = new int[10];//存储每个数字有几个

for (int i = 0; i

hash[nums[i]-'0']++;

int cost = Integer.MAX_VALUE;//记录最小花费

HashMap changed_nums = new HashMap<>();

//K:存储修改至哪个数字,V:存储被修改的数字及数量,即用map记录最小花费的情况有哪些

for (int i = 0; i <=9 ; i++ ){

int diff = K - hash[i];

int cur_cost = 0;

int cur_changed_num[] = new int[10];

for (int d = 1; d <=9 && diff > 0 ; d++){

if (i + d <= 9){//优先将大的修改至i

int pd = hash[i+d];

if (pd >= diff){

cur_changed_num[i+d] = diff;

diff=0;

}else {

cur_changed_num[i+d] = pd;

diff -= pd;

}

cur_cost += cur_changed_num[i+d]*d;

}

if (i - d >= 0){//再将小的修改至i

int pd = hash[i-d];

if (pd >= diff){

cur_changed_num[i-d] = diff;

diff=0;

}else {

cur_changed_num[i-d] = pd;

diff -= pd;

}

cur_cost += cur_changed_num[i-d]*d;

}

}

if (cur_cost

changed_nums.clear();//将之前的情况清空

changed_nums.put(i, cur_changed_num);//将当前情况记录下来

cost = cur_cost;

}

if (cur_cost == cost)//如果当前花费与之前的最小花费相同

changed_nums.put(i, cur_changed_num);

//如果当前花费比之前的最小花费少,直接跳过即可

}

System.out.println(cost);

String ans = Character.toString((char)('9'+1));

for (int c: changed_nums.keySet()) {

String cur_ans = getGMN(nums, N, c, changed_nums.get(c));

if (cur_ans.compareTo(ans)

ans = cur_ans;

}

System.out.println(ans);

}

private static String getGMN(char[] nums, int N, int c, int[] changed_num){

StringBuilder sb = new StringBuilder();

for (char cs : nums)

sb.append(cs);

for (int i = 0; i

if (nums[i]-'0' > c && changed_num[nums[i]-'0'] > 0){//比i大的从前往后修改

changed_num[nums[i]-'0']--;

sb.setCharAt(i, (char)('0'+c));

}

}

for (int i = N-1; i >= 0; i--){//比i小的从后往前修改

if (nums[i]-'0'  0){

changed_num[nums[i]-'0']--;

sb.setCharAt(i, (char)('0'+c));

}

}

return sb.toString();

}

}

java手机号码找靓号,选靓号相关推荐

  1. 拼多多笔试题(六):选靓号

    问题描述: A 国的手机号码由且仅由 N 位十进制数字(0-9)组成.一个手机号码中有至少 K 位数字相同则被定义为靓号.A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号. 小 ...

  2. 靓号站php,阿里宝卡选靓号php代码

    /** * @Author: Ding Jianlong * @Date: 2018-10-29 16:00:24 * @Last Modified by: Ding Jianlong * @Last ...

  3. 帮忙选个号手机号码末四位:4739、3636,2577,8968,1717,2424,8886,5678,4619,5151,6226,1212,4321,2157,3445,觉得哪个好?

    帮忙选个号手机号码末四位:4739.3636,2577,8968,1717,2424,8886,5678, 4619,5151,6226,1212,4321,2157,3445,觉得哪个好? 刚才帮忙 ...

  4. Java手机号码正则表达式验证,手机号段根据2020年最新号段所做参考

    最近需要实现java手机号码正则表达式验证,然而百度了一下发现结果挺多的,但是好像号段不全,基本上都是几年前的结果,大部分刚好就没我166的号段,我今天也查了一下最新的手机号段,重新写一遍(根据需求我 ...

  5. JAVA模拟福利彩票双色球(选号,判断是否中奖,以及中奖号码)

    一,双色球中奖规则(均不分顺序): 一等奖:6个红球+1个蓝球号码完全相同-奖金波动9000000元左右 二等奖:6个红球+0个蓝球号码相同-奖金波动150000元左右 三等奖:5个红球+1个蓝球号码 ...

  6. 关于手机号码四重号,四连号的校验

    友友们,圣诞节快乐,有没有给女朋友准备礼物那!!!作为单身狗的我也假装和哥哥去吃了饭,希望明年不是他,哈哈. 言归正传,在最近的一个需求中遇到一个关于手机号码的校验问题,的确难为了作为小白的我,现在整 ...

  7. java的环境变量classpath中加点号 ‘.’ 的作用

    java的环境变量classpath中加点号 '.' 的作用 "."表示当前目录,就是编译或者执行程序时,你的.class文件所在的目录: 当找.class文件时,先去" ...

  8. Java实现对手机号、身份证号、护照号脱敏

    目录 1.Java原生代码实现: 2.使用 Hutool 工具实现: 背景: 我们在项目中经常会需要用到用户的敏感信息,比如手机号.身份证号.护照号: 当数据需要在页面上进行展示的时候就需要进行脱敏, ...

  9. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备

    一.引言 很久前接触linux驱动就知道主设备号找驱动,次设备号找设备.这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理: 二.Linux内核主次设备号的管理 Li ...

最新文章

  1. 某程序员吐槽:组里新来一位美女同事,男同事们冲上去大献殷勤,过几天又一哄而散!...
  2. 2.03-handler_openner
  3. Asp.Net Core 混合全球化与本地化支持
  4. 【渝粤教育】国家开放大学2018年春季 8634-21TAndroid智能手机编程 参考试题
  5. mysql8.0设置用户权限_mysql8.0建立用户授予权限报错解决方法
  6. centos7安装oracle12c 二
  7. LOJ#6002. 「网络流 24 题」最小路径覆盖
  8. [置顶]LGame框架问题汇总,有疑问请发至此文
  9. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-3. 菜单)...
  10. 使用valgrind检查内存越界
  11. Tensorflow函数学习笔记2---tf.multipy和tf.matmul
  12. javascript 基础案例(循环)
  13. 用计算机编纂家谱的作用,家谱软件的比较
  14. LaTex图表中英文标题,中英文图表目录2
  15. 12代酷睿笔记本有哪些不错?游匣G16体验大升级
  16. 小尺寸android 手机推荐,喜欢小屏安卓手机的来看看,这三款便宜又好用
  17. scipy.misc.imresize改为Image.resize方法
  18. C语言 1982年我国第三次人口普查,全国人口为10.3亿,假如人口增长率为5%。编写一个程序,求在公元多少年总人口翻了一番。
  19. 雷达导引头伺服系统的建模与仿真
  20. 数据结构——通俗讲解关于任一二叉树n0=n2+1的证明

热门文章

  1. 网络-FTP协议与TFTP协议
  2. SSH和SSM的区别(springmvc简介)
  3. JavaScript-ES6新特性使用教程
  4. 人类禁止进入的“微博”,我的AI机器人在那里吹牛,“勾搭”AI小姑娘
  5. OpenHarmony-Hi3518EV300挂载烧写
  6. Python基础入门之二进制的负数
  7. 华为EMUI10升级名单曝光,共33款机型,看看你的华为手机在内吗
  8. AttributeError: module ‘tensorflow._api.v2.train‘ has no attribute ‘NewCheckpointReader‘解决方案
  9. 信息安全技术网络安全等级保护基本要求GB/T 22239一2019(第一级安全要求)
  10. CheckPoint Security Checkup 中文支持