乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      幾道c/c++筆試題目

       學無涯_思無涯 2013-09-12

      1、給一個數組,元素都是整數(有正數也有負數),尋找連續(xù)的元素相加之和為最大的序列。

      如:1、-2、3、5、-4、6 連續(xù)序列3、5、-4、6的和最大。
      如元素全為負數,則最大的和為0,即一個也沒有選。
      /*
      array[]     輸入數組
      n           數組元素個數
                  返回最大序列和
      */
      int find_max_sum(int array[] , int n)

      1. int find_max_sum(int array[] , int n)    
      2. {    
      3.     int i , max , sum;    
      4.     sum = max = array[0];    
      5.     for(i = 1 ; i < n ; ++i)    
      6.     {    
      7.         if(sum < 0)    
      8.             sum = array[i];    
      9.         else    
      10.             sum += array[i];    
      11.         if(sum > max)    
      12.             max = sum;    
      13.     }    
      14.     if(max < 0)    
      15.         max = 0;    
      16.     return max;    
      17. }    

      2、給定一個字符串,求出其最長重復子串

      例如:abcdabcd
      最長重復子串是 abcd,最長重復子串可以重疊
      例如:abcdabcda,這時最長重復子串是 abcda,中間的 a 是被重疊的。

      直觀的解法是,首先檢測長度為 n - 1 的字符串情況,如果不存在重復則檢測 n - 2, 一直遞減下去,直到 1 。
      這種方法的時間復雜度是 O(N * N * N),其中包括三部分,長度緯度、根據長度檢測的字符串數目、字符串檢測。

      改進的方法是利用后綴數組
      后綴數組是一種數據結構,對一個字符串生成相應的后綴數組后,然后再排序,排完序依次檢測相鄰的兩個字符串的開頭公共部分。
      這樣的時間復雜度為:生成后綴數組 O(N),排序 O(NlogN*N) 最后面的 N 是因為字符串比較也是 O(N)
      依次檢測相鄰的兩個字符串 O(N * N),總的時間復雜度是 O(N^2*logN),優(yōu)于第一種方法的 O(N^3)

      1. #include <iostream>    
      2. using namespace std;    
      3.     
      4. #define MAXCHAR 5000 //最長處理5000個字符    
      5.     
      6. char c[MAXCHAR], *a[MAXCHAR];    
      7.     
      8. int comlen( char *p, char *q )    
      9. {    
      10.     int i = 0;    
      11.     while( *p && (*p++ == *q++) )    
      12.         ++i;    
      13.     return i;    
      14. }    
      15. int pstrcmp( const void *p1, const void *p2 )    
      16. {    
      17.     return strcmp( *(charconst *)p1, *(charconst*)p2 );    
      18. }    
      19. int main(void)    
      20. {    
      21.     char ch;    
      22.     int  n=0;    
      23.     int  i, temp;    
      24.     int  maxlen=0, maxi=0;    
      25.     printf("Please input your string:\n");    
      26.     n = 0;    
      27.     while( (ch=getchar())!='\n' )    
      28.     {    
      29.         a[n] = &c[n];    
      30.         c[n++] = ch;    
      31.     }    
      32.     c[n]='\0';     // 將數組c中的最后一個元素設為空字符,以終止所有字符串    
      33.     
      34.     qsort( a, n, sizeof(char*), pstrcmp );    
      35.     for(i = 0 ; i < n-1 ; ++i )    
      36.     {    
      37.         temp=comlen( a[i], a[i+1] );    
      38.         if( temp>maxlen )    
      39.         {    
      40.             maxlen=temp;    
      41.             maxi=i;    
      42.         }    
      43.     }    
      44.     printf("%.*s\n",maxlen, a[maxi]);    
      45.     return 0;    
      46. }    

      3、字符轉換成數字,數字轉換成數組

      1. //字符轉換成數字,數字轉換成字符  
      2. #include<stdio.h>  
      3. void main()  
      4. {  
      5.     int i=0,j=0,x=0,num=0,n=1234;  
      6.     char a[]={'1','2','3','4','\0'};  
      7.     while(a[i])  
      8.     {  
      9.         num=num*10+(a[i]-'0');//字符串轉換為數字  
      10.         i++;  
      11.     }  
      12.     printf("%d\n",num);  
      13.     char temp[5],str[5];  
      14.     while(n)  
      15.     {  
      16.         temp[j]=n%10+'0';//數字轉換為字符串  
      17.         j++;  
      18.         n/=10;  
      19.     }  
      20.     temp[j]=0;  
      21.     j=j-1;  
      22.     while(j>=0)  
      23.     {  
      24.         str[x]=temp[j];//將上面的逆序轉為正序  
      25.         j--;  
      26.         x++;  
      27.     }  
      28.     str[x]=0;  
      29.     printf("%s\n",str);  
      30. }  

      4、求兩個數組的交集

      問題: 給你兩個排序的數組,求兩個數組的交集。
      比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5.
      思路:
      1. 每一次從B數組中取一值,然后在A數組里逐個比較,如果有相等的,則保存。該算法復雜度為 O(MN). M, N 分別為數組 A B 的長度。
      2. 因為A B 都排過序,所以,每一次從B數組取值后,可以利用二分查找看是否在數組A里有B所對應的值,這樣復雜度變成了O(N lg M)。 這里,如果N 比 M 大,可以從A中取值,然后在B中判斷是否有A的值,這樣,復雜度為  O(M lg N)。
      3. 利用hashtable. 先把A中的值存在hashtable里,然后對于每一個B中的值,判斷是否在A中存在,因為hashtable查找的平均復雜度為 O(1), 所以,整個算法復雜度為O(N), 但是,這里的空間復雜度為 O(M) 。但是,這種方法適合數組比較小的情況。因為如果A數組比較大,hashtable會出現collision的情況,這樣,查找的平均復雜度就不再是 O(1)。

      本文方法:
      因為數組A B均排過序,所以,我們可以用兩個“指針”分別指向兩個數組的頭部,如果其中一個比另一個小,移動小的那個數組的指針;如果相等,那么那個值是在交集里,保存該值,這時,同時移動兩個數組的指針。一直這樣操作下去,直到有一個指針已經超過數組范圍。

      1. public LinkedList<Integer> intersection(int[] A, int[] B) {    
      2.     if (A == null || B == null || A.length == 0 || B.length == 0return null;    
      3.     LinkedList<Integer> list = new LinkedList<Integer>();    
      4.     int pointerA = 0;    
      5.     int pointerB = 0;    
      6.     while (pointerA < A.length && pointerB < B.length) {    
      7.         if (A[pointerA] < B[pointerB]) pointerA++;    
      8.         else if (A[pointerA] > B[pointerB]) pointerB++;    
      9.         else {    
      10.             list.add(A[pointerA]);    
      11.             pointerA++;    
      12.             pointerB++;    
      13.         }    
      14.     }    
      15.     return list;     
      16. }  
      通過上面的算法可以得知,該算法復雜度為O(N + M).

      5.0-9四則運算

      1. #include <stdio.h>  
      2. #include <string.h>  
      3. #include <assert.h>  
      4. int cal(int nNum1, char op, int nNum2)  
      5. {  
      6.     if(op == '+')  
      7.     {  
      8.         return nNum1 + nNum2;  
      9.     }  
      10.     if(op == '-')  
      11.     {  
      12.         return nNum1 - nNum2;  
      13.     }  
      14.     if(op == '*')  
      15.     {  
      16.         return nNum1 * nNum2;  
      17.     }  
      18.     if(op == '/')  
      19.     {  
      20.         return nNum1 / nNum2;  
      21.     }  
      22. }  
      23.   
      24. int calculate(int len, char *expstr)  
      25. {  
      26.     assert(expstr);  
      27.     if(len < 3)  
      28.     {  
      29.         return -1;  
      30.     }  
      31.     char *p = expstr;  
      32.     int nNum1 = p[0] - '0';  
      33.     char op = p[1];  
      34.     int nNum2 = p[2] - '0';  
      35.     p += 3;  
      36.     while(*p)  
      37.     {  
      38.         if(*p=='*' || *p=='/')  
      39.         {  
      40.             nNum2 = cal(nNum2, *p, p[1]-'0');  
      41.         }  
      42.         else  
      43.         {  
      44.             nNum1 = cal(nNum1, op, nNum2);  
      45.             op = *p;  
      46.             nNum2 = p[1] - '0';  
      47.         }  
      48.         p += 2;  
      49.     }  
      50.     return cal(nNum1, op, nNum2);  
      51. }  
      52.   
      53. int main()  
      54. {  
      55.     char str[] = "8+7*2-9/3";  
      56.     scanf("%s",&str);  
      57.     int res = calculate(strlen(str), str);  
      58.     printf("result: %d\n", res);  
      59.   
      60.     return 0;  
      61. }  

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多