牛客选靓号即拼多多20200410笔试第三题
链接: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笔试第三题相关推荐
- 2018拼多多校招笔试贪心编程题小熊吃糖详解
题目描述 有n只小熊,他们有着各不相同的战斗力.每次他们吃糖时,会按照战斗力来排,战斗力高的小熊拥有优先选择权.前面的小熊吃饱了,后面的小熊才能吃.每只小熊有一个饥饿值,每次进食的时候,小熊们会选择最 ...
- 拼多多笔试题(六):选靓号
问题描述: A 国的手机号码由且仅由 N 位十进制数字(0-9)组成.一个手机号码中有至少 K 位数字相同则被定义为靓号.A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号. 小 ...
- 拼多多店铺是如何运营高客单价的商品,拼多多可以买高客单价的商品吗?
众所周知,拼多多店铺都是以低价来闻名的,但是也不可能全是低价,那些高客单价的商品在拼多多是如何运营的 第一步:选品.定价.测试 选品讲究的是数据分析,调查市场,选品需要记住的一点就是差异化,因为差异化 ...
- java手机号码找靓号,选靓号
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- 拼多多2020校招部分编程题
文章目录 拼多多2020校招部分编程题 多多的排列函数 canci 拼多多2020校招部分编程题 #include <iostream> using namespace std; int ...
- 【牛客】摩拜2018校招数据分析工程师笔试解析
[牛客]摩拜2018校招数据分析工程师笔试解析 * 选择题都有正确答案,后面五道大题均是我的答案,欢迎大家讨论纠正! (https://www.nowcoder.com/test/11453292/s ...
- 【编程练习】拼多多2021笔试真题集
题目来源:牛客,拼多多2021笔试真题集 第一题:多多的数字组合 打卡题,很明显的两个约束:每个位数各不相同 + 数字最小,在这两个条件的约束下,N最大为45,对应的数字为123456789. 代码如 ...
- 拼多多2018年校招真题
拼多多2018年校招真题 题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出 ...
- 从外卖员到拼多多程序工程师,三面拿下电子offer,成功转行!
前言 java作为目前火的计算机语言之一,一直都是程序员喜爱的计算机语言,java更是蝉联连续几年的计算机语言榜首,因此每年入职的java程序员都居高不下.当然,在入职之前,都是要经过面试的,那么ja ...
最新文章
- vue 02-上计算属性、样式的操作,指令(含自定义,全局和局部)
- python序列类型-python序列类型种类详解
- 如何吧本地仓库提交到github_解锁GitHub(5)之GitHub本地仓库使用
- 开源内容管理系统 php mysql_「分享」7 个精致的 PHP 开源内容管理系统(CMS)
- 主要技术指标简介_期货常用技术指标(五)布林线
- windows update失败还原更改,无法开机
- webshpere缓存--JSP
- hdu5831 Rikka with Parenthesis II
- LeetCode 294. 翻转游戏 II(记忆化递归)
- Pecl和Pear的区别和联系?
- 灵光一闪-(面对对象实践)
- codevs 4189 字典
- 如何在vue中使用阿里图标库
- 闪迪tf卡量产工具_Tony哥的自修室:相机SD卡摔碎角,钣金喷漆技术活复原一波...
- 安卓开发常用词汇总结
- h3c无线认证服务器,H3C无线路由器配置样例之无认证接入
- unity木船模型,古代帆船模型,古船
- 返还delegation
- 获取input内容并回填_Input选项框的回填与取值
- JS如何实现电子签名