发布于 2014-12-15 07:38:57 | 129 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

人人网

人人拥有中国领先的实名制社交网络平台,在用户数、页面浏览量、访问次数和用户花费时长等方面均占据优势地位。用户可以在这一平台上相互交流,分享信息和用户自创内容,玩在线游戏,听音乐,参与团购,并享受一系列其它服务


本文为大家整理提供的是一份人人网2014笔试算法题(附参考答案),感兴趣的同学参考下。

   1.给出一个有序数组啊,长度为len,另外给出第三个数X,问是否能在数组中找到两个数,这两个数之和等于第三个数X。

   我们首先看到第一句话,这个数组是有序的,所以,我们可以定义两个指针,一个指向数组的第一个元素,另一个指向应该指向的位置(这个需要看具体的实现和数组给定的值),首先计算两个位置的和是否等于给定的第三个数,如果等于则算法结束,如果大于,则尾指针向头指针方向移动,如果小于,则头指针向尾指针方向移动,当头指针大于等于尾指针时算法结束,没有找到这样的两个数。

   解法一:

   #include

   int judge(int *a, int len, int k, int *num1, int *num2);

   int main(int argc, char **argv)

   {

   int test_array[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

   int result = -1;

   int num1, num2;

   result = judge(test_array, sizeof(test_array) / sizeof(int), 12, &num1, &num2);

   if(result == 0)

   {

   printf("%dt%dn", num1, num2);

   }

   else if(result == -1)

   {

   printf("can't find");

   }

   else

   {

   printf("error");

   }

   }

   int judge(int *a, int len, int k, int *num1, int *num2)

   {

   int *low = NULL;

   int *high = NULL;

   int i = 0;

   int result = -1;

   if(a == NULL || len < 2)

   {

   return result;

   }

   if(a[0] >= k)

   {

   return result;

   }

   while(a[i] <= k && i < len)

   {

   i++;

   }

   low = a;

   high = a + i - 1;

   while(low < high)

   {

   *num1 = *low;

   *num2 = *high;

   if((*low + *high) == k)

   {

   result = 0;

   break;

   }

   else if((*low + *high) > k)

   {

   high--;

   }

   else if((*low + *high) < k)

   {

   low++;

   }

   }

   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[x - a[i]] = 1;

   }

   for (int i=0; i

   {

   if (hash_table[i] == 1)

   {

   return true;

   }

   }

   return false;

   }

   int main()

   {

   int len = 10;

   int a[10] = {1, 3, 5, 7, 9, 4, 2, 8, 10, 6};

   int x = 19;

   if (judge(a, len, x))

   {

   cout<<"Yes"<

   }

   else

   {

   cout<<"No"<

   }

   system("pause");

   return 0;

   }

   本题解决方法: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

   {

   if (count == 0)

   {

   t = a[i];

   count = 1;

   continue;

   }

   else

   {

   if (a[i] == t)

   {

   count++;

   }

   else

   {

   count--;

   }

   }

   }

   return t;

   }

   int main()

   {

   int n = 10;

   int a[10] = {1, 3, 2, 3, 3, 4, 3, 3, 3, 6};

   cout<

   system("pause");

   return 0;

   }

   Time Complexity: O(n)

   Space Complexity:O(1)



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务