2016蘭亭校招C++

zs_find發表於2015-10-16

這個是我這個菜鳥筆試遇到的程式設計題,感覺有點像動態劃分,當時沒做出來。。。非常慚愧~

寫出來,慢慢積累吧~~

 

輸出n位的整數,使整數中相鄰的兩位整數數字差的絕對值大於等於4。輸出所有滿足此條件的整數。

例如:輸入:n=5; 輸出:37051,38051,39051

思考:首先第一位是1~99個數字中選擇,其餘的n-1位從0~9選擇。

     我的想法是,先確定第一位數,然後依據條件確定第二位,再依據第二位的數值,確定第三位以此類推~

     實際上就是一個遞迴的運算,這裡,遞迴結束的條件為:n個整數均已選好。

看程式,時間複雜度有些高,望前輩們指教~

#include<iostream>
#include<vector>

using namespace std;

static vector<int>  v_ans;

void FindInteger(int pre_int,int n)
{
	if (v_ans.size() > n)
		return;
	if (v_ans.size() == n)
	{
		for (vector<int>::iterator it = v_ans.begin(); it != v_ans.end(); it++)
		{
			cout << *it;
		}
		cout << endl;
	}

	for (int i = 0; i <= 9; i++)
	{
		if (abs(i - pre_int) >= 4)
		{
			v_ans.push_back(i);
			FindInteger(v_ans.back(),n);
			v_ans.pop_back();
		}
		
		
	}
}

int main()
{
	cout << "please intput n:" << endl;//你想輸出幾位數
	int N;
	cin >> N;

	for (int i = 1; i <= 9; ++i)
	{
		v_ans.resize(1);
		v_ans[0] = i;
		FindInteger(v_ans.back(),N);
	}
	
	

	system("pause");
	return 0;
}

在做這個題目的時候,需要清楚vector容器的使用,剛開始在初始化v_ans的時候,就是給整數的第一位賦值的時候,直接使用了v_ans[0]=i;執行時總是崩潰,後來才 知道使用索引[]操作符對vecor操作,不會自動申請記憶體空間,則要手動用resize函式來申請空間(這是參考的別人的部落格的結論)。

相關文章