人人网2014笔试算法题汇总

来源:互联网 发布:什么是网络语言 编辑:程序博客网 时间:2024/05/16 08:36


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

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

解法一:

#include <stdio.h>    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("%d\t%d\n", 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 <iostream>    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<len; ++i)      {          hash_table[x - a[i]] = 1;      }        for (int i=0; i<len; ++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"<<endl;      }      else      {          cout<<"No"<<endl;      }      system("pause");      return 0;  }  

本题解决方法:hash table。

时间复杂度:O(N)

空间复杂度:O(N)


2.给定有n个数的数组a,其中有超过一半的数为一个定值,在不进行排序,不开设额外数组的情况下,以最高效的算法找出这个数。

int find(int* a, int n);

#include <iostream>    using namespace std;    int find(int *a, int n)  {      int t = a[0];      int count = 0;      for (int i=0; i<n; ++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<<find(a, n)<<endl;        system("pause");      return 0;  }  

Time Complexity: O(n)

Space Complexity:O(1)


转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12209217



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办 无塔供水井水水位低了怎么办 应急部成立林场的专业灭火队怎么办 路由器我恢复出厂设置断网了怎么办 多囊卵巢综合症不来月经怎么办 天刀普通血战苍梧城没有太白怎么办 天涯明月刀把沈妄言打入水中怎么办 天涯明月刀刷本队友技能太花怎么办 手机收所有短信时显示被隐藏怎么办 div放图片多出的空白怎么办 我14岁射精让我记忆力差了怎么办 qq闪退聊天记录全没了怎么办 木瓜奇迹忘记升级过头转职了怎么办 孩子进入青春期什么坏事都干怎么办 母狗狗第一次来月经应该怎么办图 社保断了想补缴怎么办?这些要知道