经典面试题(十二)——顺序输出从1到N位数

来源:互联网 发布:个人软件开发合同范本 编辑:程序博客网 时间:2024/06/06 12:37


第一种使用大数加法。。。

第二种使用对数字的全排列,时间是O(10^N),而空间是O(N)。要注意一点的是数字的首位不能为0,同时输出字符数组最后一位应该以'\0'为结尾。

代码如下所示:


#include <iostream>using namespace std;void printNum(char num[], int start, int end){  if(start==end)    cout<<num<<endl;  else{    for(char i='0'; i <= '9'; ++i){      num[start] = i;      printNum(num,start+1,end);    }  }}void printNum(int n){  char *num = new char[n+1];  for(int i = 1 ; i <= n ; ++i){    num[i] = '\0';    for(char j = '1'; j <= '9'; ++j){      num[0] = j;      printNum(num,1,i);    }  }  delete[] num;}int main(){  printNum(4);  system("PAUSE");  return 0;}

扩展问题,排列和组合问题可以参考上述代码很快的实现出来。

排列问题可以考虑一下使用一个数组标志该位是否被访问过了,如果被访问过了则不将该字符排列进去。

代码如下所示:

void permutation(char str[], bool *visited, const int len, int index){  if(index==len)    cout<<str<<endl;  else{    for(int i = 0; i < len; ++i)      if(0==visited[i]){        visited[i] = 1;        str[index] = i+'a';        permutation(str,visited,len,index+1);        visited[i] = 0;      }  }}void permutation(int n){  char *str = new char[n+1];  str[n] = '\0';  bool *visited = new bool[n];  memset(visited,0,sizeof(bool)*n);    permutation(str,visited,n,0);}

代码输出的是a-z,的排列,通过输入长度n来控制。