面试题整理
转自:http://blog.csdn.net/v_july_v/article/details/6803368
- 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。思路:判断各自素数乘积是否相等。更多方法请参见:http://blog.csdn.net/v_JULY_v/article/details/6347454。
- 将链表中连续两个数据调换位置。例如:1->2->3->4->5,经变换后为2->1->4->3->5.
View Code1 void reverseList(SLNode *head) 2 { 3 SLNode* pre = head; 4 while(pre != NULL && pre->next != NULL && pre->next->next != NULL) 5 { 6 SLNode* p1 = pre->next; 7 SLNode* p2 = p1->next; 8 SLNode* pNext = p2->next; 9 p2->next = p1; 10 p1->next = pNext; 11 pre->next = p2; 12 pre = p1; 13 } 14 15 SLNode* p = head->next; 16 while(p!= NULL) 17 { 18 cout << p->data << " "; 19 p = p->next; 20 } 21 cout << endl; 22 }
- 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
View Code1 /* 2 若能产生rand(x) = 1-10*n之间的等概率随机数,则一定能产生1-10间的等概率随机数,即rand(x)%10+1; 3 而(rand7()-1)*7+rand7()能产生1-49之间的等概率随机数,将其中的41-49剔除后,能产生1-40之间的等概率随机数 4 */ 5 6 int rand10() 7 { 8 int x; 9 do 10 { 11 x = (rand7()-1)*7+rand7(); 12 } while (x>40); 13 return (x%10+1); 14 }
- 上下排填数,要求下排每个数都是先前上排那是个数出现的次数。思想:F(B[n], n,sum),B[0]=sum,if(n==0); F(B[n],sum)=F(B[n-1],sum-i),else
View Code1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 #define MaxNum 20 6 #define Len 10 7 8 int A[Len] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 9 10 //判断产生的数组是否满足要求 11 bool isLegal(int* B, int n) 12 { 13 if(B == NULL || n <= 0) 14 throw new exception("Invalid Parameters!"); 15 int hash[MaxNum]; 16 memset(hash, 0, sizeof(hash)); 17 int index; 18 for(index = 0; index < n; index++) 19 { 20 int data = B[index]; 21 hash[data]++; 22 } 23 for(index = 0; index < n; index++) 24 { 25 int data = A[index]; 26 if(hash[data] != B[index]) 27 break; 28 } 29 if(index != n) return false; 30 else return true; 31 } 32 33 //打印数组 34 void PrintOut(int* B, int n) 35 { 36 for(int index = 0; index < n; index++) 37 cout << B[index] << " "; 38 cout << endl; 39 } 40 41 //搜索数组 42 void FindB(int* B, int n, int sum) 43 { 44 if(B == NULL || n < 0 || sum < 0) 45 throw new exception("Invalid parameters!"); 46 if(n == 0) 47 { 48 B[0] = sum; 49 if(isLegal(B, Len)) 50 PrintOut(B, Len); 51 } 52 else 53 { 54 for(int index = 0; index < sum; index++) 55 { 56 B[n] = index; 57 FindB(B, n-1, sum-index); 58 } 59 } 60 } 61 62 int _tmain(int argc, _TCHAR* argv[]) 63 { 64 int B[Len]; 65 FindB(B, Len-1, Len); 66 system("pause"); 67 return 0; 68 }
- 输入两个整数n和m,从数列1,2,3,...n中随意取几个数使其和为m,要求将其中所有的可能组合列出来。
View Code1 /*类似0/1完全背包问题*/ 2 #include "stdafx.h" 3 #include <iostream> 4 #include <vector> 5 using namespace std; 6 7 //打印合法的组合 8 void PrintOut(vector<int>& ivec) 9 { 10 vector<int>::iterator iter = ivec.begin(); 11 while(iter != ivec.end()) 12 { 13 cout << *iter++ << " "; 14 } 15 cout << endl; 16 } 17 18 //选取其中的数值 19 void selectNum(vector<int>& ivec, int index, int sum, int m, int n) 20 { 21 if(sum == m) 22 { 23 PrintOut(ivec); 24 return; 25 } 26 else 27 { 28 if(index > (m-sum))return; 29 else 30 { 31 for(int i = index; i <= n; i++) 32 { 33 ivec.push_back(i); 34 sum += i; 35 selectNum(ivec, i+1, sum, m, n); 36 int data = ivec.back(); 37 ivec.pop_back(); 38 sum -= data; 39 } 40 } 41 } 42 } 43 44 //在1-n里面选取一些数据使其和为m 45 void seletToM(int m, int n) 46 { 47 int sum = 0; 48 vector<int> ivec; 49 selectNum(ivec, 1, sum, m, n); 50 }
可供参考关键思想代码:
View Code1 list<int>list1; 2 void find_factor(int sum, int n) 3 { 4 // 递归出口 5 if(n <= 0 || sum <= 0) 6 return; 7 8 // 输出找到的结果 9 if(sum == n) 10 { 11 // 反转list 12 list1.reverse(); 13 for(list<int>::iterator iter = list1.begin(); iter != list1.end(); iter++) 14 cout << *iter << " + "; 15 cout << n << endl; 16 list1.reverse(); 17 } 18 19 list1.push_front(n); //典型的01背包问题 20 find_factor(sum-n, n-1); //放n,n-1个数填满sum-n 21 list1.pop_front(); 22 find_factor(sum, n-1); //不放n,n-1个数填满sum 23 }


浙公网安备 33010602011771号