去掉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位后找最小数的更多相关文章

  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. u盘安装ubuntu10.04 、11.04 server

    10.04 先将 ubuntu server 的 iso 放到优盘上,然后在提示无法找到光驱时,按 alt+f2 打开一个新的 console 窗口,将 iso mount 上,具体操作如下: ls ...

  2. 使用poi和jfreechart生成excel图表图片

    最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西.有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现. 除此之外,也有一些功能只需要生成对应的 ...

  3. ffmpeg tutorial01 再分析

    如下图

  4. vxworks for x86读取bios时间的解决方法

    vxworks for x86读取bios时间的解决方法 系统时间与bsp有关,在vzworks for x86系列的目标没有直接读取RTC(实时时钟控制器)的函数,用time.h中的函数读到的始终是 ...

  5. hihocoder1388 Periodic Signal

    FFT 就可以了 比赛时候没时间做了 #include<bits/stdc++.h> using namespace std; typedef long long ll; const in ...

  6. 你还在为如何区分ASCII编码、GB2312编码、Unicod、UTF-8编码而烦恼吗,一篇文章让你柳暗花明

    字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  7. Java面试题积累

    持续积累中... 1.Java支持的数据类型有哪些?什么是自动拆装箱? 数据类型分为两大种,基本类型和引用类型. 基本类型有8种:byte short int long char float doub ...

  8. 【USACO09OCT】热浪Heat Wave

    题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...

  9. 一些比较隐秘的OJ的网址

    ( 1 )COGS:cogs.pro:8080 ( 2 )AGC:agc012.contest.atcoder.jp ( 3 )CS Acaemy:csacademy.com ( 4 )JoyOI:w ...

  10. HiHocoder1419 : 后缀数组四·重复旋律4&[SPOJ]REPEATS:Repeats

    题面 Hihocoder Vjudge Sol 题目的提示说的也非常好 我对求\(LCP(P - L + len \% l, P + len \% L)\)做补充 \(len=LCP(P, P + L ...