2016兰亭校招C++

来源:互联网 发布:软件自由职业者 编辑:程序博客网 时间:2024/05/17 08:27

这个是我这个菜鸟笔试遇到的编程题,感觉有点像动态划分,当时没做出来。。。非常惭愧~

写出来,慢慢积累吧~~

 

输出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函数来申请空间(这是参考的别人的博客的结论)。

0 0