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位数里面最小的那一个. 写的代码例如以下,思 ...
随机推荐
- 吐槽版︱MRO-Microsoft R Open快捷键+界面识别+功能设置
下载了之后,发现连运行(RUN键)在哪都不知道,蒙逼的在哪倒弄半天,都执行不了...问了别人,都说"ctrl+enter",但是我的电脑执行不了,于是今天就狠狠的一个一个按钮的点一 ...
- phpcms V9 默认模板文件目录结构_PHPCms教程
PHPCMSV9 默认模板目录结构 templates 框架系统模板目录 announce 公告 show.html 内容页 ...
- 【linux】安裝 PHP时出现error: Cannot find MySQL header files
checking for specified location of the MySQL UNIX socket... no checking for MySQL UNIX socket locati ...
- tcp为什么要三次握手,而不能二次握手?
谢希仁版<计算机网络>中的例子是这样的,"已失效的连接请求报文段"的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞 ...
- C#中各种计时器 Stopwatch、TimeSpan
1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch)Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 St ...
- Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher a ...
- 芝麻HTTP:Scrapy小技巧-MySQL存储
这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...
- tcp_wrapper
介绍 对基于tcp协议开发并提供服务的应用程序,所提供的一层访问控制工具 基于库调用实现其功能 * 库名:libwrap 判断服务是否能够由tcp_wrapper进行访问控制 1. 动态编译 ldd命 ...
- 滚动条实现RGB颜色的调制(窗体程序)--JAVA基础
1.用到的JFrame类的对象frame的方法: frame.setLayout(); 设置框架布局格式,有frame.setLayout(new GridLayout(5,1));为网格布局格式 f ...
- Python爬虫 股票数据爬取
前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取.目标抓取平安银行(000001)从1989年~2017年的全部财务数据. 数据源分析 地址分析 http://m ...