`
wss71104307
  • 浏览: 222985 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

对于给定的整数,求出删除该整数中的一个数字后得到的最小值

阅读更多

对于给定的整数,求出删除该整数中的一个数字后得到的最小值.

比如,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;
}
 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics