---9月22日,人人校招筆試題
遍曆,時間複雜度為O(N2),很顯然,這種方法沒什麼實際意義,而且題目中說了這個一個有序數組,採用遍曆的方法是你想不出其他解法時的最壞選擇而已!
的,那麼每次移動指向的值較大的指標;
的,那麼每次移動指向的值較小的指標;
#include <stdio.h>#include <stdlib.h>#include <string.h>int Judge(int *a, int len, int x){ int Ascending = 0;//為1表示升序,否則降序 Ascending = a[1] > a[0] ? 1 : 0; int *CopyA = (int *)malloc(sizeof(int) * len); memset(CopyA, 0, sizeof(int) * len); //構建另一數組 int icount = 0; for(icount = 0; icount < len; icount++) { CopyA[icount] = x - a[icount]; } //比較兩個指標移動的值,這裡用索引代替指標 int i = len - 1, j = 0; while(i >= 0 && j < len) { if(a[i] > CopyA[j]) { switch(Ascending) { case 0: j++; break;//降序 case 1: i--; break;//升序 default:break; } } else if(a[i] == CopyA[j] && i != j) { return 1; } else { switch(Ascending) { case 0: i--; break;//降序 case 1: j++; break;//升序 default:break; } } } return 0;}int main(){ int a[] = {1, 2, 3, 4}; int len = 4; int x = 8; switch(Judge(a, len, x)) { case 0: printf("%d isn't exist!", x);break; case 1: printf("%d is exist!", x);break; default : break; } return 0;}
這道題目其實我沒有想到十分有效方法,題解參考的編程之美2.3尋找發帖“水王”。
,直到數組中的元素全部相同為止,最後剩下的數組相同的元素一定就是這個定值,這裡使用一個計數器cnt,對數組中某個數VeryNum進行計數,通過計數器的加減來找到該定值。
#include <stdio.h>#include <stdlib.h>int find(int *a, int n){ int VeryNum = 0; int cnt = 0; int i = 0; for(i = 0; i < n; i++) { if(cnt == 0) { VeryNum = a[i]; cnt = 1; } else { if(a[i] == VeryNum) { cnt++; } else { cnt--; } } } return VeryNum;}int main(void){ int a[] = {15, 15, 5, 15, 5, 15, 1}; int n = 7; printf("%d\n", find(a, n)); return 0;}
http://blog.csdn.net/v_july_v/article/details/11921021