去掉K位求取最小数

  一个n位的数,去掉其中的k位,怎样使留下来的(n-k)位数按原来的前后顺序组成的数最小

例如

8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123。

解决方案

贪心算法,在每次被访问的位置保证有最优解。

思路一

分析:求一共n位,求其中的m位组成的数最小。那么这个m位的数,最高位应该在原数的最高位到第m位区间找,要不然就不能当第m位了,如下图(得到3位数最小,要是百位数在25中找,就当不了百位数了):

同样找十位数时只能在百味数到目前位置中间搜,整个过程图示如下:

注意

在区间有多个最小值,取距离最大的,保证下一位数有足够大的查找空间。

参考代码

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cassert>
  4. using namespace std;
  5. int *q;
  6.  
  7. int findMinIndex(int arr[], int beg, int end) //[]
  8. {
  9. if(beg > end)
  10. return -;
  11. int minv = arr[beg];
  12. int minIndex = beg;
  13. for(int i = beg + ; i <= end; ++i)
  14. {
  15. if(arr[i] < minv)
  16. {
  17. minv = arr[i];
  18. minIndex = i;
  19. }
  20. }
  21. return minIndex;
  22. }
  23.  
  24. int getRemain(int arr[], int size, int k)
  25. {
  26. assert(size > k && k >= );
  27. int rev = , revIndex = -;
  28. for(int i = size - k; i < size; ++i)
  29. {
  30. revIndex = findMinIndex(arr, revIndex + , i);
  31. rev = rev * + arr[revIndex];
  32. }
  33. return rev;
  34. }
  35.  
  36. int main()
  37. {
  38. int arr[] = {, , , , , , };
  39. size_t size = sizeof(arr) / sizeof(int);
  40.  
  41. int remainNum;
  42. for (int k = size-; k > ; --k)
  43. {
  44. int remainNum = getRemain(arr, size, size - k);
  45. cout << "When k = " << k << ", the remaining value is:" << remainNum << endl;
  46. }
  47.  
  48. }

结果

分析

时间复杂度O(KN)

思路二

分析:从前往后找,每次访问一位,比较该位前边的数,如果比该位大,果断干掉,例如:

同样以此往后遍历,知道干掉个数为k或访问到最后了,整个过程图示如下图。当然遍历到最后还没有干掉K个元素,说明剩下的已经为升序了,这样就在留下的数中取出前(n-k)个,整合成整数就是最小值。

参考代码

  1. #include <iostream>
  2. #include <cassert>
  3. using namespace std;
  4.  
  5. int getRemain(int *arr, int size, int k)
  6. {
  7. assert(size > k && k > );
  8. int tmp = size - k;
  9. int cur = , pre;
  10. int rev = ;
  11. while(k != && cur < size)
  12. {
  13. pre = cur - ;
  14. while(pre >= )
  15. {
  16. if(arr[pre] >= arr[cur])
  17. {
  18. for(int i = pre; i < size; ++i)
  19. arr[i] = arr[i+];
  20. --cur;
  21. --k;
  22. --size;
  23. }
  24. --pre;
  25. }
  26. ++cur;
  27. }
  28.  
  29. for(int i = ; i < tmp; ++i)
  30. {
  31. rev = rev * + arr[i];
  32. }
  33. return rev;
  34. }
  35.  
  36. int main()
  37. {
  38. int arr[] = {, , , , , , };
  39. size_t size = sizeof(arr) / sizeof(int);
  40.  
  41. int remainNum;
  42. remainNum = getRemain(arr, size, );
  43. cout << "When k = " << << ", the remaining value is:" << remainNum << endl;
  44. }

分析

时间复杂度O(KN)

Algorithm --> n位数去掉k位后找最小数的更多相关文章

  1. [LeetCode] Remove K Digits 去掉K位数字

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  2. [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 ...

  3. 剑指offer43:左旋转字符串(字符串):对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    1 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”a ...

  4. 整数m去掉n位后剩下最大(小)值

    题目描述 给定一个正整数(<=255位),从中删去n位后,使得剩下的数字组成的新数最小(大): 思路:从左到右开始扫描,两两比较,如果是前一位比后一位大,则删去前大的一位,直到删完所有的n位: ...

  5. 编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。

    function digit(num,k){         var knum = 0;         for(var i=1; i<=k; i++){                 knu ...

  6. 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  7. 取n的第k位

    实例二:取n的第k位 方法:a>> k & 1 某值a右移K位后与整数“1”进行与运算.即把需要第几位就右移几位. 例子: 0000 1000 ------8右移3位 0000 0 ...

  8. 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小

    例如 8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123. 解决方案 贪心算法,在每次被访问的位置保证有最优解. 思路一 分析:求一共n位,求其中的m位组成的数最小 ...

  9. Hulu面试题解答——N位数去除K个数字(解法错误sorry)

    给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...

随机推荐

  1. AVS、MPEG-2、H264标准文档

    联合信源对AVS解码源码和相应的AVS码流.AVS码流太大,可以从http://cosoft.org.cn/projects/avsdec下载.解压avsdec_source.zip后,用VC6编译a ...

  2. windows 下安装或者卸载memcache

    1.安装到系统服务中: 在doc中:执行此软件 memcached.exe -d install(如果提示错误,要找到cmd.exe用管理员身份打开) 2.卸载: 在doc中:执行此软件 memcac ...

  3. javascript 一些关于css操作的函数

    // 通过样式表 获得css样式 //obj 表示dom对象,name 表示css属性 比如width等 function getStyle(obj,name){ if(obj.currentStyl ...

  4. 使用ifstream和getline读取文件内容[c++]

    转载:http://www.cnblogs.com/JCSU/articles/1190685.html 假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion ...

  5. 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 ...

  6. iOS - Core Animation 核心动画的使用

    1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...

  7. 「拆小鹤」使用 python 实现 QQ机器人服务。

    使用的是python的qqbot机器人库,我其实只是实现了这个库的一个插件. 具体的说明,我觉得qqbot的官方文档,还有我的插件的注释都写得很详细了,可以直接看.所以有空再写吧. 没错我就是懒..

  8. Jmeter_针对响应信息不明确的接口做关联

    下午写一个新功能的接口脚本,遇到几个技术问题,现在将解决方案写出来 1:做接口关联的时候,发现接口响应没有可以利用的信息.如下图只返回了一个成功的标识,这样的接口如何与之关联? 通过抓包观察后续的修改 ...

  9. 【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 ...

  10. (3)Deep Learning之神经网络和反向传播算法

    往期回顾 在上一篇文章中,我们已经掌握了机器学习的基本套路,对模型.目标函数.优化算法这些概念有了一定程度的理解,而且已经会训练单个的感知器或者线性单元了.在这篇文章中,我们将把这些单独的单元按照一定 ...