链接:https://www.nowcoder.com/questionTerminal/005af31a10834b3688911463065ab47d?orderByHotValue=0&mutiTagIds=579&page=2&onlyReference=false
来源:牛客网

A 国的手机号码由且仅由 N 位十进制数字(0-9)组成。一个手机号码中有至少 K 位数字相同则被定义为靓号。A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号。
小多想花钱将自己的手机号码修改为一个靓号。修改号码中的一个数字需要花费的金额为新数字与旧数字之间的差值。比如将 1 修改为 6 或 6 修改为 1 都需要花 5 块钱。
给出小多现在的手机号码,问将其修改成一个靓号,最少需要多少钱?

//思路:记录0-9数字分别在字符串中出现的个数,遍历分别换成K个i(0-9)所需要的cost,记录
//最小cost的i取值和cost,再考虑如何把字符串换成K个i获得的字典序列最小,详见代码注释
import java.util.*;
import java.io.*;public class Main{public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));//pdd 3找最修改数字最多为K个的最小花费问题String[] arr = in.readLine().split(" ");int N = Integer.valueOf(arr[0]);int K = Integer.valueOf(arr[1]);char[] cs = in.readLine().toCharArray();int[] ns = new int[cs.length];int[] count = new int[10];for(int i=0;i<cs.length;i++){ns[i] = Integer.parseInt(String.valueOf(cs[i]));count[ns[i]]++;}int store = 0;int ansCost = Integer.MAX_VALUE;//最小花费int mid = -1;//选定的数字中心for(int i=0;i<10;i++){store = K - count[i];int lstep = 1;int rstep = 1;int tmpCost = 0;while (store > 0){//往左右两边搜索需要改变的数字if(store != 0 && i+rstep<10){//先换右边字典序列更靠前int minus = Math.min(store,count[i+rstep]);store -= minus;tmpCost += minus * rstep;rstep++;}if(store != 0 && i-lstep>=0){int minus = Math.min(store,count[i-lstep]);store -= minus;tmpCost += minus * lstep;lstep++;}}if(tmpCost < ansCost) {ansCost = tmpCost;mid = i;}}//换取需要变动的字符串,为了换取后是最小的字典序列,先从左向右换取比中心值大的字符串,注意这里要先换完所有mid最近的数//比如mid是 3 我要先把所有的4先换掉,因为要保证cost最小!!!再换所有的2,直到换的数目得到满足store = K - count[mid];int step = 1;while(store > 0){if(mid + step < 10){for(int i=0;i<ns.length;i++){if(ns[i] == mid+step){ns[i] = mid;store--;if(store <= 0)break;}}}if(store <= 0)break;if(mid - step >= 0){//这里要从右向左换!!!for(int i=ns.length-1;i>=0;i--){if(ns[i] == mid-step){ns[i] = mid;store--;if(store <= 0)break;}}}step++;}System.out.println(ansCost);for(int i=0;i<ns.length;i++){System.out.print(ns[i]);}}
}
//393333393333883383337333333933778733383333373
//393333393333883383337333333933778733383333373

牛客选靓号即拼多多20200410笔试第三题相关推荐

  1. 2018拼多多校招笔试贪心编程题小熊吃糖详解

    题目描述 有n只小熊,他们有着各不相同的战斗力.每次他们吃糖时,会按照战斗力来排,战斗力高的小熊拥有优先选择权.前面的小熊吃饱了,后面的小熊才能吃.每只小熊有一个饥饿值,每次进食的时候,小熊们会选择最 ...

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

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

  3. 拼多多店铺是如何运营高客单价的商品,拼多多可以买高客单价的商品吗?

    众所周知,拼多多店铺都是以低价来闻名的,但是也不可能全是低价,那些高客单价的商品在拼多多是如何运营的 第一步:选品.定价.测试 选品讲究的是数据分析,调查市场,选品需要记住的一点就是差异化,因为差异化 ...

  4. java手机号码找靓号,选靓号

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import  ...

  5. 拼多多2020校招部分编程题

    文章目录 拼多多2020校招部分编程题 多多的排列函数 canci 拼多多2020校招部分编程题 #include <iostream> using namespace std; int ...

  6. 【牛客】摩拜2018校招数据分析工程师笔试解析

    [牛客]摩拜2018校招数据分析工程师笔试解析 * 选择题都有正确答案,后面五道大题均是我的答案,欢迎大家讨论纠正! (https://www.nowcoder.com/test/11453292/s ...

  7. 【编程练习】拼多多2021笔试真题集

    题目来源:牛客,拼多多2021笔试真题集 第一题:多多的数字组合 打卡题,很明显的两个约束:每个位数各不相同 + 数字最小,在这两个条件的约束下,N最大为45,对应的数字为123456789. 代码如 ...

  8. 拼多多2018年校招真题

    拼多多2018年校招真题 题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出 ...

  9. 从外卖员到拼多多程序工程师,三面拿下电子offer,成功转行!

    前言 java作为目前火的计算机语言之一,一直都是程序员喜爱的计算机语言,java更是蝉联连续几年的计算机语言榜首,因此每年入职的java程序员都居高不下.当然,在入职之前,都是要经过面试的,那么ja ...

最新文章

  1. a卡显存检测软件_科普小课堂,A卡玩家如何轻松超频?
  2. java chunked 解码_模拟http请求 带 chunked解析办法一
  3. Android最佳性能实践(二)——分析内存的使用情况
  4. python高阶函数求导_Python---高阶函数
  5. VTK:方向标记用法实战
  6. html如何让框架的边框消失,css如何让边框透明?
  7. JAVA重载和重写的区别?
  8. Java虚拟机专题之字节码指令(读书笔记)
  9. BZOJ 2724: [Violet 6]蒲公英
  10. python开发自动化创建一个任务下发到手机_python自动化开发问题集
  11. cloudera-scm-agent 已死,但 pid 文件存在
  12. HBase常用命令使用
  13. 高校舆情分析python_微博的高校舆情监控系统设计
  14. 无法安装打印机,打印处理器不存在
  15. 读书笔记之吴伯凡·认知方法论
  16. mysql身份证号的类型_MySQL--隐藏手机号、身份证号三种方式
  17. ERROR: Command errored out with exit status 1
  18. Linux 进程通信(System V)消息队列
  19. 代码设计时应遵循哪些原则
  20. 华为服务器修改snmp用户,华为S5700交换机Telnet、SSH、SNMP基础远程管理配置

热门文章

  1. ALEVEL数学、物理、化学、生物与国内考试的区别
  2. 关于 高内聚 和 低耦合 的理解
  3. GPE监控预警系统-node_exporter.md
  4. 基于远程服务器安装配置Anaconda环境及创建python虚拟环境详细方案
  5. android安装多个微信支付,android微信支付详解与坑
  6. Electron应用实现自动更新
  7. 取消谷歌浏览器主页出现hao123
  8. 【Unity 学习笔记】动画组件和动画控制器
  9. mysql 事务一直running问题排查
  10. php购物车修改单价,vuejs+elementui 购物车价格计算,点击加减号修改数量总价都不会改变,但是计算执行了...