对于给定的整数,求出删除该整数中的一个数字后得到的最小值.
比如,1214 ,去掉2,得到的结果是114为最小值.
算法: 删除数字中的极大值( 左边的数字递增,右边紧邻的数字是减少的或者本身为最后一位。例如:1214 中的2 ; 122543中的5; 1334中的4)
证明:假设极大值为第i位,记为X[i].分2种情况,
1 。如果删除 i 左边的某位记第j位,即删除X[j]
删除前 ----jj+1---i----
删除 X[j] 后 ----j+1---i---
删除 X[i] 后 ----j ----------
因为i左边的是递增的,X[j] < x[j+1] , 删除X[j]后的值 比删除X[i] 的值大。 故 不可能删除比i左边的某位
2。 如果删除i 右边的某位,i 左边的那些位保持不变,而删除X[i]后,相比不删除X[i],X[i+1] 取代了X[i]的位置;而由于
X[i+1] < x[i] 的,所以删除X[i] 比 删除i 右边其他的任何一位都要小。
综上,故需要删除第i位。(极大值的那一位)
代码如下:(估计有更好的代码,如有请留言给我O(∩_∩)O谢谢)
#include <vector>
#include <iostream>
using namespace std;
void int_to_array(int N, vector< int > & A)
{
while(N)
{
A.push_back( N % 10);
N = N / 10;
}
}
int find_min(const int& N)
{
if( N>=0 && N <10) return 0;
vector< int > iv;
int_to_array(N, iv);
vector<int>::iterator ite = iv.end();
--ite;
//删去极大值(比左边所有位大,比右边紧邻着的一位小)
//vector end 1214 begin 删除2
for(;;)
{
if(ite == iv.begin() || *ite > *(ite-1)) //从左到右找到第一个比右边大的那一位,若没找到就是最右边一位
{
iv.erase(ite);
break;
}
--ite;
}
//把vetor转为int
int M = 0;
for(ite = iv.end() - 1; ; --ite)
{
M =M * 10 + *ite;
if(ite == iv.begin()) break;
}
return M;
}
int main()
{
for(int i = 500; i < 1000; i= i + 3)
{
cout<<"原来:"<< i << "减去一位"<< find_min(i)<<endl;
}
return 0;
}