Algorithm --> n位数去掉k位后找最小数
去掉K位求取最小数
一个n位的数,去掉其中的k位,怎样使留下来的(n-k)位数按原来的前后顺序组成的数最小
例如
8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123。
解决方案
贪心算法,在每次被访问的位置保证有最优解。
思路一
分析:求一共n位,求其中的m位组成的数最小。那么这个m位的数,最高位应该在原数的最高位到第m位区间找,要不然就不能当第m位了,如下图(得到3位数最小,要是百位数在25中找,就当不了百位数了):
同样找十位数时只能在百味数到目前位置中间搜,整个过程图示如下:
注意
在区间有多个最小值,取距离最大的,保证下一位数有足够大的查找空间。
参考代码
- #include <iostream>
- #include <cstdlib>
- #include <cassert>
- using namespace std;
- int *q;
- int findMinIndex(int arr[], int beg, int end) //[]
- {
- if(beg > end)
- return -;
- int minv = arr[beg];
- int minIndex = beg;
- for(int i = beg + ; i <= end; ++i)
- {
- if(arr[i] < minv)
- {
- minv = arr[i];
- minIndex = i;
- }
- }
- return minIndex;
- }
- int getRemain(int arr[], int size, int k)
- {
- assert(size > k && k >= );
- int rev = , revIndex = -;
- for(int i = size - k; i < size; ++i)
- {
- revIndex = findMinIndex(arr, revIndex + , i);
- rev = rev * + arr[revIndex];
- }
- return rev;
- }
- int main()
- {
- int arr[] = {, , , , , , };
- size_t size = sizeof(arr) / sizeof(int);
- int remainNum;
- for (int k = size-; k > ; --k)
- {
- int remainNum = getRemain(arr, size, size - k);
- cout << "When k = " << k << ", the remaining value is:" << remainNum << endl;
- }
- }
结果
分析
时间复杂度O(KN)
思路二
分析:从前往后找,每次访问一位,比较该位前边的数,如果比该位大,果断干掉,例如:
同样以此往后遍历,知道干掉个数为k或访问到最后了,整个过程图示如下图。当然遍历到最后还没有干掉K个元素,说明剩下的已经为升序了,这样就在留下的数中取出前(n-k)个,整合成整数就是最小值。
参考代码
- #include <iostream>
- #include <cassert>
- using namespace std;
- int getRemain(int *arr, int size, int k)
- {
- assert(size > k && k > );
- int tmp = size - k;
- int cur = , pre;
- int rev = ;
- while(k != && cur < size)
- {
- pre = cur - ;
- while(pre >= )
- {
- if(arr[pre] >= arr[cur])
- {
- for(int i = pre; i < size; ++i)
- arr[i] = arr[i+];
- --cur;
- --k;
- --size;
- }
- --pre;
- }
- ++cur;
- }
- for(int i = ; i < tmp; ++i)
- {
- rev = rev * + arr[i];
- }
- return rev;
- }
- int main()
- {
- int arr[] = {, , , , , , };
- size_t size = sizeof(arr) / sizeof(int);
- int remainNum;
- remainNum = getRemain(arr, size, );
- cout << "When k = " << << ", the remaining value is:" << remainNum << endl;
- }
分析
时间复杂度O(KN)
Algorithm --> n位数去掉k位后找最小数的更多相关文章
- [LeetCode] Remove K Digits 去掉K位数字
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- [LeetCode] 402. Remove K Digits 去掉K位数字
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- 剑指offer43:左旋转字符串(字符串):对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
1 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”a ...
- 整数m去掉n位后剩下最大(小)值
题目描述 给定一个正整数(<=255位),从中删去n位后,使得剩下的数字组成的新数最小(大): 思路:从左到右开始扫描,两两比较,如果是前一位比后一位大,则删去前大的一位,直到删完所有的n位: ...
- 编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。
function digit(num,k){ var knum = 0; for(var i=1; i<=k; i++){ knu ...
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 取n的第k位
实例二:取n的第k位 方法:a>> k & 1 某值a右移K位后与整数“1”进行与运算.即把需要第几位就右移几位. 例子: 0000 1000 ------8右移3位 0000 0 ...
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123. 解决方案 贪心算法,在每次被访问的位置保证有最优解. 思路一 分析:求一共n位,求其中的m位组成的数最小 ...
- Hulu面试题解答——N位数去除K个数字(解法错误sorry)
给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...
随机推荐
- AVS、MPEG-2、H264标准文档
联合信源对AVS解码源码和相应的AVS码流.AVS码流太大,可以从http://cosoft.org.cn/projects/avsdec下载.解压avsdec_source.zip后,用VC6编译a ...
- windows 下安装或者卸载memcache
1.安装到系统服务中: 在doc中:执行此软件 memcached.exe -d install(如果提示错误,要找到cmd.exe用管理员身份打开) 2.卸载: 在doc中:执行此软件 memcac ...
- javascript 一些关于css操作的函数
// 通过样式表 获得css样式 //obj 表示dom对象,name 表示css属性 比如width等 function getStyle(obj,name){ if(obj.currentStyl ...
- 使用ifstream和getline读取文件内容[c++]
转载:http://www.cnblogs.com/JCSU/articles/1190685.html 假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion ...
- code is 9998;desc is 插入失败exception is org.hibernate.exception.JDBCConnectionException: Could not op
1.错误描述 [ERROR:]2015-05-05 09:27:12,090 [插入失败] org.hibernate.exception.JDBCConnectionException: Could ...
- iOS - Core Animation 核心动画的使用
1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...
- 「拆小鹤」使用 python 实现 QQ机器人服务。
使用的是python的qqbot机器人库,我其实只是实现了这个库的一个插件. 具体的说明,我觉得qqbot的官方文档,还有我的插件的注释都写得很详细了,可以直接看.所以有空再写吧. 没错我就是懒..
- Jmeter_针对响应信息不明确的接口做关联
下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...
- 【POJ2387】Til the Cows Come Home (最短路)
题面 Bessie is out in the field and wants to get back to the barn to get as much sleep as possible bef ...
- (3)Deep Learning之神经网络和反向传播算法
往期回顾 在上一篇文章中,我们已经掌握了机器学习的基本套路,对模型.目标函数.优化算法这些概念有了一定程度的理解,而且已经会训练单个的感知器或者线性单元了.在这篇文章中,我们将把这些单独的单元按照一定 ...