2012Google校园招聘笔试题
1、已知两个数字为1~30之间的数字,甲知道两数之和,乙知道两数之积,甲问乙:“你知道是哪两个数吗?”乙说:“不知道”。乙问甲:“你知道是哪两个数吗?”甲说:“也不知道”。于是,乙说:“那我知道了”,随后甲也说:“那我也知道了”,这两个数是什么?
- 答案:
- 允许两数重复的情况下
- 答案为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
- 不允许两数重复的情况下有两种答案
- 答案1: 为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
- 答案2: 为x=, y=; 甲知道和A=x+y=, 乙知道积B=x*y=
- 解:
- 设这两个数为x,y.
- 甲知道两数之和 A=x+y;
- 乙知道两数之积 B=x*y;
- 该题分两种情况
- 允许重复, 有( <= x <= y <= );
- 不允许重复,有( <= x < y <= );
- 当不允许重复, 即( <= x < y <= );
- )由题设条件:乙不知道答案
- <=> B=x*y 解不唯一
- => B=x*y 为非质数
- 又∵ x ≠ y
- ∴ B ≠ k*k (其中k∈N)
- 结论(推论1):
- B=x*y 非质数且 B ≠ k*k (其中k∈N)
- 即:B ∈(,,,,,,,...)
- 证明过程略
- )由题设条件:甲不知道答案
- <=> A=x+y 解不唯一
- => A >= ;
- 分两种情况
- A=,A=6时x,y有双解
- A>= 时x,y有三重及三重以上解
- 假设 A=x+y=
- 则有双解
- x1=,y1=;
- x2=,y2=
- 代入公式B=x*y:
- B1=x1*y1=*=; (不满足推论1,舍去)
- B2=x2*y2=*=;
- 得到唯一解x=,y= 即甲知道答案
- 与题设条件:“甲不知道答案”相矛盾
- 故假设不成立, A=x+y≠
- 假设 A=x+y=
- 则有双解
- x1=,y1=;
- x2=,y2=
- 代入公式B=x*y:
- B1=x1*y1=*=; (不满足推论1,舍去)
- B2=x2*y2=*=;
- 得到唯一解x=,y=
- 即甲知道答案
- 与题设条件:“甲不知道答案”相矛盾
- 故假设不成立, A=x+y≠
- 当A>=7时
- ∵ x,y的解至少存在两种满足推论1的解
- B1=x1*y1=*(A-)
- B2=x2*y2=*(A-)
- ∴ 符合条件
- 结论(推论2):A >=
- )由题设条件:乙说“那我知道了”
- => 乙通过已知条件B=x*y及推论()()可以得出唯一解
- 即:
- A=x+y, A >=
- B=x*y, B ∈(,,,,,,,,...)
- <= x < y <=
- x,y存在唯一解
- 当 B= 时:有两组解
- x1=, y1=
- x2=, y2= (∵ x2+y2=+= < ∴不合题意,舍去)
- 得到唯一解 x=, y=
- 当 B= 时:有两组解
- x1=, y1=
- x2=, y2= (∵ x2+y2=+= < ∴不合题意,舍去)
- 得到唯一解 x=, y=
- 当 B> 时:容易证明均为多重解
- 结论:
- 当B=6时有唯一解 x=, y= 当B=8时有唯一解 x=, y=
- )由题设条件:甲说“那我也知道了”
- => 甲通过已知条件A=x+y及推论()可以得出唯一解
- 综上所述,原题所求有两组解:
- x1=, y1=
- x2=, y2=
- 当x<=y时,有( <= x <= y <= );
- 同理可得唯一解 x=, y=
2、一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。
高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)
它给出了部分代码如下:
- #define N 25
- double D[N]
- ....
- void Preprocess()
- {
- //Write your code1;
- }
- double Distance(int i, int j)
- {
- //Write your code2;
- }
- const int N = ;
- int D[N];
- int A1toX[N];
- void Preprocess()
- {
- srand(time());
- for (int i = ; i < N; ++i)
- {
- D[i] = (rand()/(RAND_MAX+1.0)) * N;
- }
- A1toX[] = D[]; //from A1 to A2
- for (int i = ; i < N; ++i)
- {
- A1toX[i] = A1toX[i-] + D[i]; //distance from A1 to each point
- }
- A1toX[] = A1toX[N-] + D[]; // total length
- }
- int distance(int i, int j)
- {
- int di = (i == ) ? : A1toX[i-];
- int dj = (j ==) ? : A1toX[j-];
- int dist = abs(di - dj);
- return dist > A1toX[]/ ? A1toX[] - dist : dist;
- }
- int main(void)
- {
- Preprocess();
- for (int i = ; i <N; ++i)
- {
- cout<<D[i]<<" ";
- }
- cout<<endl;
- for (int i = ; i <= N; ++i)
- {
- cout<<"distance from A1 to A"<<i<<": "<<distance(, i)<<endl;
- }
- return ;
- }
3、 一个字符串,压缩其中的连续空格为1个后,对其中的每个字串逆序打印出来。比如"abc efg hij"打印为"cba gfe jih"。
- #include<iostream>
- #include<cstdio>
- #include<stack>
- #include<string>
- using namespace std;
- string reverse(string str)
- {
- stack<char> stk;
- int len = str.length();
- string ret = "";
- for (int p = , q = ;p < len;)
- {
- if (str[p] == ' ')
- {
- ret.append(,' ');
- for (q = p; q < len && str[q] == ' '; q++)
- {}
- p = q;
- }
- else
- {
- for (q = p; q < len && str[q] != ' '; q++)
- {
- stk.push(str[q]);
- }
- while(!stk.empty())
- {
- ret.append(,stk.top());
- stk.pop();
- }
- p = q;
- }
- }
- return ret;
- }
- int main(void)
- {
- string s = "abc def ghi";
- cout<<reverse(s).c_str()<<endl;
- return ;
- }
4、将一个较大的钱,不超过1000000(10^6)的人民币,兑换成数量不限的100、50、10、5、2、1的组合,请问共有多少种组合呢?(完全背包)(其它选择题考的是有关:操作系统、树、概率题、最大生成树有关的题。)。
第一种方法(母函数):
- #define NUM 7
- int money[NUM] = {, , , , , , };
- // 母函数解法
- int NumOfCoins(int value)
- {
- int i , j , k , c1[] , c2[];
- for(i = ; i <= value ; ++i)
- {
- c1[i] = ;
- c2[i] = ;
- }
- //第一层循环是一共有 n 个小括号,而刚才已经算过一个了
- // i 就是代表的母函数中第几个大括号中的表达式
- for(i = ; i < NUM ; ++i)
- {
- for(j = ; j <= value ; ++j) //j 就是指的已经计算出的各项的系数
- {
- for(k = ; k+j <= value ; k += money[i]) //k 就是指将要计算的那个括号中的项
- c2[k+j] += c1[j];
- }
- for(j = ; j <= value ; ++j) // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项
- {
- c1[j] = c2[j];
- c2[j] = ;
- }
- }
- return c1[value];
- }
第二种方法(动态规划):
我们可以将它形式化为:
硬搜的话肯定是可以出结果的,但时间复杂度太高。
第一种方法:
设 F[n] 为用那么多种面值组成 n 的方法个数。则 F[n] 可以分成这样互不重复的几个部分:
只用 50 及以下的面值构成 [n] + 0 张 100
只用 50 及以下的面值构成 [n-100] + 1 张 100
只用 50 及以下的面值构成 [n-200] + 2 张 100
……
也就是说,按 F[n] 的组成方案中 100 的张数,将 F[n] 划分成若干等价类,等价类的划分要不重复、不遗漏。这些等价类恰好完整覆盖了 F[n] 的所有情况。
然后对于 50 及以下的方案又可以按 50 的张数划分等价类。于是像这样一层一层递归下去……就可以得到结果了。
把上面的递归过程反过来,从下往上递推,这就是动态规划了。代码(用到了一些 C99 特性,比如栈上的可变长数组):
时间复杂度 < O(N^2)
- #define NUM 7
- int money[NUM] = {, , , , , , };
- // 动态规划解法
- int NumOfCoins(int value)
- {
- int i , j , t , dp[][];
- for(i = ; i <= value ; ++i)
- dp[][i] = ;
- for(i = ; i < NUM ; ++i)
- {
- for(j = ; j <= value ; ++j)
- {
- t = j;
- dp[i][j] = ;
- while(t >= )
- {
- dp[i][j] += dp[i-][t];
- t -= money[i];
- }
- }
- }
- return dp[][value];
- }
其中 dp[i][j] 表示只用第 i 张面值及以下构成 j 用多少种方法。
改进如下:
a[6][n] = ar[6][n-100] // 至少包含 1 张 100 的拆分个数
+ ar[5][n] // 不包含 100 的拆分个数
直接把时间复杂度从 O(n^2) 降到了 O(n):
- #define NUM 7
- int money[NUM] = {, , , , , , };
- // 动态规划解法(完全背包)
- int NumOfCoins(int value)
- {
- int i , j , dp[][];
- for(i = ; i <= value ; ++i)
- dp[][i] = ;
- for(i = ; i < NUM ; ++i)
- {
- for(j = ; j <= value ; ++j)
- {
- if(j >= money[i])
- dp[i][j] = dp[i][j - money[i]] + dp[i - ][j];
- else
- dp[i][j] = dp[i-][j];
- }
- }
- return dp[][value];
- }
或者使用滚动数组也是可以的
- #define NUM 7
- int money[NUM] = {, , , , , , };
- int f[] , bf[];
- // f[j] == f[i][j] bf[j] == bf[i-1][j]
- int NumofCoin2(int value)
- {
- int i , j;
- for(j = ; j <= value ; ++j)
- f[j] = , bf[j] = ;
- bf[] = ;
- for(i = ; i < NUM ; ++i)
- {
- for(j = ; j <= value ; ++j)
- {
- if(j >= money[i])
- f[j] = f[j-money[i]] + bf[j];
- else
- f[j] = bf[j] ;
- }
- for(j = ; j <= value ; ++j)
- bf[j] = f[j] , f[j] = ;
- }
- return bf[value];
- }
2012Google校园招聘笔试题的更多相关文章
- 2014 WAP校园招聘笔试题
2014 WAP校园招聘笔试题 Problem's Link: http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...
- google2013校园招聘笔试题(全国)
google2013校园招聘笔试题 1. 单项选择题1.1如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少.关于一下几种典型的数据传输速率:1.使用USB2.0闪存盘,往USB闪存盘上拷贝 ...
- Microsoft 2013校园招聘笔试题及解答
Microsoft 2013校园招聘笔试题及解答 题目是自己做的,求讨论.吐槽.拍砖 1. Which of the following callingconvension(s) suppo ...
- Microsoft2013校园招聘笔试题
Microsoft2013校园招聘笔试题 继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently ...
- C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]
MS Recognition 在线提交: hihoCoder 1402 http://hihocoder.com/problemset/problem/1402 类似: OpenJudge - I:P ...
- 京东2017校园招聘笔试题 【第K个幸运数】
题目描述 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字. 前几个幸运数字为:4,7,44,47,74,77,444,447... 现在输入一个数字K,输出第 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- PPS2013校园招聘笔试题
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/11473405 一.简答题 (1)一位老师有2个推理能力很强的学生,他告诉 ...
- Microsoft2013校园招聘笔试题及解答
继续求拍砖!!!! 1. You are managing the database of a book publichser, you currently store the book orders ...
随机推荐
- HLS
2018-04-14 WMY-竹海 相约电子ee 首先要启动软件,界面如下所示: 以最简单的矩阵运算为例吧,来介绍一下HLS的使用. 对于HLS的输入为C++或C代码,当然systemC也可以,主要完 ...
- Datatable转实体 实体转换辅助类
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...
- PostgreSQL判断是否为空coalesce
coalesce(expr1,expr2,expr3...) 直到找到一个非null值返回,右边的表达式则不参与运算:若所有为null,返回null. eg:判断json是否包含某属性,若无,则取默认 ...
- 通过ip查找能应机器的MAC
例如:10.100.0.61 这些都是基于linux系统: 首先:ping 一下这个ip 然后arp 10.100.0.61就可以找出主机的MAC地址
- Gradle-修改.gradle默认目录
在Windows的环境变量中新建一个环境变量设置,GRADLE_USER_HOME,值为D:\Users\shaowei\.gradle,设置完成之后,点击确定,关闭设置窗口.这个时候可以去AS中看下 ...
- lua笔记二 赋值语句
赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" t.n = t.n + 1 Lua可以对多个变量同时赋值,变量列 ...
- TF-IDF理解及其Java实现
TF-IDF 前言 前段时间,又具体看了自己以前整理的TF-IDF,这里把它发布在博客上,知识就是需要不断的重复的,否则就感觉生疏了. TF-IDF理解 TF-IDF(term frequency–i ...
- javascript基础拾遗(三)
1.map数组映射操作 function add(x) { return x+1 } var nums = [1,3,5,7,9] result = nums.map(add) console.log ...
- 【Socket】linux套接字技术之tcp
1.mystery引入 1)UDP也可以编写出C/S程序 ,另外TCP也可以编写点对点通信. 2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神. 3)当前流 ...
- Java获取此次请求URL以及服务器根路径的方法
http://www.jb51.net/article/71693.htm ********************************************** 本文介绍了Java获取此次请求 ...