声明:图片来自网络,笔者只是试着做了一下,然后做个记录。

拿到这个题目的时候,笔者首先想到的是二分。两个数组,一个是全体员工的集合A;一个是缺少一人的集合B。对A,B排序,再对B进行二分,得到B的中间员工的工号mid,若A[mid] == B[mid],那么缺席员工的工号在mid之后,继续二分;若A[mid] < B[mid],那么缺席员工的工号在mid之前,继续二分。值得注意的是,这里A[mid]是不会大于B[mid]的。另外,这里的二分仅针对缺席工号在数组中间的情况。若缺席工号在数组(当然是排序后)首尾,单独处理即可。

 #include <bits/stdc++.h>
using namespace std; typedef long long LL;
#define MOD 1000000007ll
#define PI acos(-1.0)
const double EPS = 1e-;
//const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
//const LL MOD = 1e9+7; template <class T> inline T bigMod(T p, T e, T M){
long long ret = ;
for(; e > ; e >>= ){
if(e & ) ret = (ret * p) % M;
p = (p * p) % M;
} return (T)ret % M; // Attention: bigMod(p, 0, 1), so ret has to module M.
}
template <class T> inline T modInverse(T a, T M){return bigMod(a, M-, M);}
template <class T> inline T gcd(T a, T b){return b ? gcd(b, a%b) : a;}
int main() {
int T;
scanf("%d", &T);
for (int i = ; i <= T; ++i) {
vector<int> total;
vector<int> arrive;
int num; cin >> num;
for (int j = ; j < num; ++j) {
int employee; cin >> employee;
total.push_back(employee);
}
for (int j = ; j < num - ; ++j) {
int arriver; cin >> arriver;
arrive.push_back(arriver);
}
/*** binary search
sort(total.begin(), total.end());
sort(arrive.begin(), arrive.end());
if (total[0] != arrive[0]) cout << total[0] << endl;
else if (total[num-1] != arrive[num-2]) cout << total[num-1] << endl;
else {
int left = 0, right = num - 2;
while(left <= right) {
int mid = left + (right - left)/2;
if (total[mid] == arrive[mid]) {
left = mid + 1;
}else if (total[mid] < arrive[mid]){
right = mid - 1;
}
}
cout << total[left] << endl;
}*/
int num1 = ;
for (auto iter = total.begin(); iter != total.end(); ++iter) {
num1 = num1 ^ *iter;
}
int num2 = ;
for (auto iter = arrive.begin(); iter != arrive.end(); ++iter) {
num2 = num2 ^ *iter;
}
cout << (num1 ^ num2) << endl;
}
return ;
}

后来有个朋友提出了一个更好的方法,简直漂亮。利用异或的思想。

我们先来看这样一个表达式: p ^ q = m, m等于p,q的异或。那么有,p = q ^ m,  q = p ^ m。

现在,回过头来看这个题目。我们把A中的元素互相异或得到m;把B中的元素互相异或得到p。那么,没来的哪个员工工号是q=m^p。

代码的实现也综合在上诉代码中。

百度2017笔试题:寻找n个员工中未打卡的那一个的更多相关文章

  1. [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】

    /*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...

  2. 【Python】:用python做下百度2014笔试题

    国庆节最后一天,明天就要上班了,闲来无事做做百度2014笔试题,好久没用过C++了,索性就用python简单的写一下,体验下题目难度.题目是从[大卫David]那里copy过来的. 1.给定任意一个正 ...

  3. 2017头条笔试题:二维点集中找出右上角没有点的点并按x坐标从小到大打印坐标

    PS:这篇是之前本来就想发的但是一直没时间写,加上今天做了京东的题,结果代码名就命名为jingdong了……懒得改代码名重新跑一遍结果了=.= 暴力法去做就是遍历每个点,判断它是不是“最大点”.判断过 ...

  4. 【面试笔试算法】Problem 1 : DP滑雪问题--网易互联网算法实习生2017笔试题

    Description Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激.可是 为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  5. 考研计算机复试(广东工业大学C语言复试2014~2017笔试题)(精华题选)

    1.C语言中,全局变量的存储类别是() A.extern B.void C.int   D.static 2.静态变量: (1)static 外部变量===>在函数外定义,只能在本文件中使用 ( ...

  6. 2016届百度实习生前端笔试题上海卷a

    1.写出javascript运行结果:alert(‘5’+5); 结果:alert()函数中不能进行算术运算或字符串拼接,故不会弹出对话框.   2.写出javascript运行结果:for(var ...

  7. 2015年百度实习生前端笔试题上海卷a

    1.写出javascript运行结果:alert(‘5’+5); 结果:’55’ 2.写出javascript运行结果:for(var i=0; i<10; i++){} alert(i); 结 ...

  8. [LeetCode每日一题]153.寻找旋转排序数组中的最小值

    [LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...

  9. 百度2016研发project师笔试题(四)

    百度2016研发project师笔试题(四) 2015/12/8 10:42(网上收集整理的,參考答案在后面.若有错误请大神指出) 1. 关于MapReduce的描写叙述错误的是() A. 一个Tas ...

随机推荐

  1. C#实现按Word模板导出Word(加书签bookMark)

    本方法是针对word导出操作,需要制作好的模板文件 模板.doc 引入应用Microsoft.Office.Interop.Word 11.0  (office2003) 导出文件注意:有时候迅雷会在 ...

  2. Ubuntu切换至root用户

    第一种方式: 使用命令 sudo passwd root 设置root用户的密码 然后su root即可切换至root用户  第二种方式: sudo bash

  3. AlarmManager类的应用(实现闹钟功能)

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  4. 8月9日,PS、计算机基础(预科)

    一.   PS         掌握简单的图标修改. 1.图层                 2.保存PSD格式,有图层:JPG格式,没有图层.                 3.魔棒工具(调整值 ...

  5. 玩转kindle paperwhite: 如何越狱,安装强大外挂软件koreader

    NOTICE 1: 在更新kpvbooklet和使用最新版本的koreader(v2013.03-211)时候,会出现pdf文档无法重排的错误.亲测. 如果你是使用的最新版本koreader且出现上述 ...

  6. C和C++运算符 (转)

    这里是C和C++语言的运算符列表.所有列出的运算符皆含纳于C++:第三个栏目里的内容也使用C来描述.应当注意的是C不支持运算符重载. 下列运算符在两个语言中都是顺序点(运算符未重载时): && ...

  7. 【LeetCode题意分析&解答】42. Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  8. java使用验证码进行登录验证

    随机生成4位验证码,将生成的4位数字字母数字放入session private static void outputVerifyCode(HttpServletRequest request, Htt ...

  9. [LeetCode]题解(python):144-Binary Tree Preorder Traversal

    题目来源: https://leetcode.com/problems/binary-tree-preorder-traversal/ 题意分析: 前序遍历一棵树,递归的方法很简单.那么非递归的方法呢 ...

  10. RedisTemplate.htm

    http://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTe ...