面试题整理

转自:http://blog.csdn.net/v_july_v/article/details/6803368

  1. 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)思路:判断各自素数乘积是否相等。更多方法请参见:http://blog.csdn.net/v_JULY_v/article/details/6347454
  2. 将链表中连续两个数据调换位置。例如:1->2->3->4->5,经变换后为2->1->4->3->5.
     1 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 }
    View Code
  3. 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10
     1 /*
     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 }
    View Code
  4. 上下排填数,要求下排每个数都是先前上排那是个数出现的次数。思想:F(B[n], n,sum),B[0]=sum,if(n==0); F(B[n],sum)=F(B[n-1],sum-i),else
     1 #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 }
    View Code 
  5. 输入两个整数n和m,从数列1,2,3,...n中随意取几个数使其和为m,要求将其中所有的可能组合列出来。
     1 /*类似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 Code

     可供参考关键思想代码:

     1 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 }  
    View Code

     

posted @ 2014-03-24 22:08  ggbailei  阅读(119)  评论(0)    收藏  举报