陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
来源:互联网 发布:android需要看java书籍 编辑:程序博客网 时间:2024/04/28 00:11
题目
对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:121。
分析
一个n位数,删去k位后,也就是剩下一个 n-k位 数,那么这个数要最小,我们就要保证我们我们得出的数是所有删除后得到的数的最小值。那么怎么保证呢?
问题转换一下,如果最后就剩下一位,那么无意结果就是这些数字的最小值; 如果最后剩下两位呢,那么我们所要结果的最高位肯定在给定数的哪个区间呢,在这个区间(从左往右数第一位,从右往左数第二位),且是其中的最小值,而次最高位呢,肯定在哪个区间呢,在这个区间(刚才最高位+1,从右往左数第一位即是最后一位);如果最后剩下三位数呢,有点长举个例子,数 20192,k=2,那么就是剩下三位数,最高位即百位肯定在这个区间((从左往右数第一位,从右往左数第三位)),取最小数0即从左往右第二位,那么剩下的十位数字肯定在(刚才得到的那个最小值的位加一即从左往右数第三位,从右往左数第二位)这个区间里,取最小即是从左往右第三位1,接着最后结果的个位数字肯定在这个区间里(刚才得到的那个最小值的位加一即从左往右数第四位,从右往左数第一位)取最小值是2即是最后一位,程序结束的边境条件是搜索区间右界达到原数的从右往左数第一位,即最后结果三位数是012(所有的区间里位数都针对的是原数);依次最后结果是五位,六位,七位。。。。。。。
时间复杂度
0(k*(n-k))
一共有n-k数字,求每个数字要用的区间大小是k
实验室据
程序
#include<iostream>using namespace std ;const int K = 5 ;const int size = 12 ;void GetMinBit( int * data,int length,int start,int end,int &bit ){ if( data != NULL || length < 1 ) { if( 0 <= start && start <= end && end < length ) { int min = *(data+start) ; bit = start; for( int i=start ; i <= end ; i++ ) { if( *(data+i) < min ) { min = *(data+i); bit = i; } } } else { cout<<"start "<<start<<" end "<<end<<" length "<<length<<endl ; system("pause") ; } } else { cout<<"length "<<length<<" data "<<data<<endl; system("pause") ; }}int GetMinData(int * data,int length,int k ){ if( data != NULL || length < 1 ) { if( 0 <= k && k < length ) { int result = 0 ; int bit = -1 ; int end = k ; while( end<length ) { GetMinBit( data,length,bit+1,end,bit ); result = result*10 + *(data+bit); end++ ; } return result ; } else { cout<<"k "<<k<<" length "<<length<<endl; system("pause") ; } } else { cout<<"length "<<length<<" data "<<data<<endl; system("pause") ; }} int main(){ int * data = new int[size]; for(int i= 0 ;i<size ; i++ ) { *(data+i)=rand()%10; } for(int i= 0 ;i<size ; i++ ) { cout<<*(data+i)<<" "; } cout<<endl; cout<<"result "<<GetMinData( data,size,K )<<endl; system("pause"); return 0;}
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。
- 键盘输入一个高精度的正整数n(<=240位),去掉任意s(s<n)个数字后,将剩下的数字按原左右次序组成一个新的正整数。
- 从一不含0的高精度正整数中去掉N个数字后按原左右次序组成一最小的数
- hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)
- 算法题—n位正整数去掉k(k<=n)位数字得到最小数
- n个正整数联接成一排,组成一个最小的多位整数
- n个正整数,联接成一排,组成一个最小(最大)的多位整数
- n个正整数联接成一排,组成一个最小的多位整数
- 设有n个正整数,将他们连接成一排,组成一个最小的多位整数
- n个正整数,联接成一排,组成一个最大(最小)的多位整数 python
- 贪心算法:N位数删除K个数字,使剩下的数字串最小
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 代码片段1
- 离散数学学习笔记1
- 1071. Speech Patterns (25)
- Why my application crashes on process termination when file sinks are used?
- How To Make a Simple iPhone Game with Flash CS5
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- 设计模式OO基础原则模式
- 1.范磊的C++从新手到高手的章节
- ASP.NET网站如何设置404错误页面
- z-index 属性
- 今天心情不好
- Impala学习--代码生成(Code Generation)
- ASP.NET FileUpload应用实例
- 乱码问题