1.給出乙個有序陣列啊,長度為len,另外給出第三個數x,問是否能在陣列中找到兩個數,這兩個數之和等於第三個數x。
我們首先看到第一句話,這個陣列是有序的,所以,我們可以定義兩個指標,乙個指向陣列的第乙個元素,另乙個指向應該指向的位置(這個需要看具體的實現和陣列給定的值),首先計算兩個位置的和是否等於給定的第三個數,如果等於則演算法結束,如果大於,則尾指標向頭指標方向移動,如果小於,則頭指標向尾指標方向移動,當頭指標大於等於尾指標時演算法結束,沒有找到這樣的兩個數。
解法一:
#include int judge(int *a, int len, int k, int *num1, int *num2);
int main(int argc, char **argv)
; int result = -1;
int num1, num2;
result = judge(test_array, sizeof(test_array) / sizeof(int), 12, &num1, &num2);
if(result == 0)
else if(result == -1)
else
}
int judge(int *a, int len, int k, int *num1, int *num2)
if(a[0] >= k)
while(a[i] <= k && i < len)
low = a;
high = a + i - 1;
while(low < high)
else if((*low + *high) > k)
else if((*low + *high) < k)
} return result;
}
解法二:
#include using namespace std;
int hash_table[100];
bool judge(int *a, int len, int x)
{ memset(hash_table, 0, sizeof(hash_table));
for (int i=0; i本題解決方法:hash table。
時間複雜度:o(n)
空間複雜度:o(n)
2.給定有n個數的陣列a,其中有超過一半的數為乙個定值,在不進行排序,不開設額外陣列的情況下,以最高效的演算法找出這個數。
int find(int* a, int n);
#include using namespace std;
int find(int *a, int n)
{ int t = a[0];
int count = 0;
for (int i=0; i
time complexity: o(n)
space complexity:o(1)
美團網2014筆試演算法題彙總
1.鍊錶翻轉。給出乙個鍊錶和乙個數k,比如鍊錶1 2 3 4 5 6,k 2,則翻轉後2 1 4 3 6 5,若k 3,翻轉後3 2 1 6 5 4,若k 4,翻轉後4 3 2 1 5 6,用程式實現。include using namespace std struct listnode listn...
暴風影音2014筆試演算法題彙總
1.自定義實現字串轉為整數的演算法,例如把 123456 轉成整數123456.輸入中可能存在符號,和數字 返回結果的有效標誌 enum status int gstatus valid int strtoint const char str while digit 0 digit 非法輸入 els...
阿里巴巴2014筆試演算法題彙總
1.兩棵二叉樹t1和t2,t1的節點數是百萬量級,t2的節點數一千以內,請給出判斷t2是否t1子樹的可行演算法。分析 首先想到的是遞迴,但是t1的數量級太大,遞迴會導致棧溢位,於是以非遞迴實現。bool issubtree binarytreenode proot1,binarytreenode p...