笔试题

小咪咪 2022-06-08 02:44 425阅读 0赞

搜狗2017年校招笔试编程题题目:

在一个圆形上的若干点,点的位置以角度的形式表示,(0-360),输入若干的点的位置,点的距离以劣弧对应角度表示,求距离最远的两个点的角度多大?(输入的数据是从小到大的顺序)
自己写的正确率不是100%
有个同学分享了复杂度O(n)的解法

  1. void farest() {
  2. int n;
  3. cin >> n;
  4. double* angle = new double[n];
  5. for (int i = 0; i < n; i++) {
  6. cin >> angle[i];
  7. }
  8. double result = 0;
  9. if (angle[n - 1] - angle[0] <= 180)
  10. result = angle[n - 1] - angle[0];
  11. else{
  12. int l = 0, r = 1;
  13. while (l < r) {
  14. while (r < n&&angle[r] - angle[l] <= 180)//r右移,找到第一个相差大于180的位置
  15. ++r;
  16. if (l < r)
  17. result = max(result, angle[r - 1] - angle[l]);//更新此时的最大角度差
  18. //l左移,找到第一个相差小于180的位置
  19. while (l < r&&l < n&&angle[r] - angle[l]>=180)
  20. ++l;
  21. if (l > 0 && r < n)
  22. result = max(result, 360-(angle[r] - angle[l-1]));
  23. }
  24. }
  25. cout << fixed << setprecision(8) << result << endl;
  26. }

迅雷2017年校招笔试编程题:

字符串问题:
输入:1->2->3->4->5
输出:2->1->4->3->5
输入:1->2->3->4
输出:2->1->4->3
注意:数字是int类型
因为Python有split函数,所以我就直接用啦

  1. def reverseStr():
  2. s = raw_input()
  3. numbers = map(int,s.split("->"))
  4. for i in range(1,len(numbers),2):
  5. numbers[i],numbers[i-1]=numbers[i-1],numbers[i]
  6. return "->".join(str(i) for i in numbers)

C++,用了之前自己编写split函数

  1. vector<string> splitString(const string& s, const string& c) {
  2. vector<string> v;
  3. int start = 0;
  4. int end = s.find(c);
  5. while (string::npos != end) {
  6. v.push_back(s.substr(start, end-start));
  7. start = end + c.size();
  8. end = s.find(c,start);
  9. }
  10. if (start != s.length())
  11. v.push_back(s.substr(start));
  12. return v;
  13. }
  14. void reverseStr() {
  15. string s;
  16. cin >> s;
  17. if (s.size() < 4)
  18. cout << s << endl;
  19. string c = "->";
  20. vector<string> vs = splitString(s, c);
  21. string res = "";
  22. for (int i = 0; i < vs.size(); i += 2) {
  23. if (i + 1 < vs.size()) {
  24. res += vs[i + 1] + c + vs[i];
  25. if (i + 1 < vs.size() - 1)
  26. res += c;
  27. }
  28. else
  29. res += vs[i];
  30. }
  31. cout << res << endl;
  32. }

百度2017年校招笔试编程题:

选择题 30道 自然语言处理、数据结构。。
问答题 1道 自然语言处理 不会
设计题 1道 推荐手机品牌 设计推荐系统 照着专利写了
编程题:
1)字符串处理
“W” “E”构成的字符串,W代表西边的房子,E代表东边的房子,字符串划分成部分,要求分错边的房子数最少
动态规划
dp[i]=dp[i-1]-1 s[i]==’W’
dp[i]=dp[i-1]+1s[i]==’E’

  1. void splitHouse() {
  2. string s;
  3. cin >> s;
  4. int W = 0;
  5. int E = 0;
  6. for (int i = 0; i < s.size(); i++) {
  7. if (s[i] == 'W')
  8. ++W;
  9. if (s[i] == 'E')
  10. ++E;
  11. }
  12. int* dp = new int[s.size()+1]();
  13. dp[0] = W;
  14. dp[s.size()] = E;
  15. int minC = W < E ? W : E;
  16. for (int i = 1; i <= s.size(); i++) {
  17. if (s[i - 1] == 'W')
  18. dp[i] = dp[i - 1] - 1;
  19. if (s[i - 1] == 'E')
  20. dp[i] = dp[i - 1] + 1;
  21. minC = minC < dp[i] ? minC : dp[i];
  22. }
  23. cout << minC << endl;
  24. }

2)连分数
输入两个字符串表示连分数X,Y。判断X,Y的大小关系。
只过了80%应该是浮点数的问题。

  1. double continuedfraction2fraction(string& s)
  2. {
  3. int i = 1;
  4. vector<int> a;
  5. while (i<s.size()) {
  6. if (isdigit(s[i])) {
  7. int v = 0;
  8. while (isdigit(s[i])) {
  9. v *= 10;
  10. v += s[i] - '0';
  11. i++;
  12. }
  13. a.push_back(v);
  14. }
  15. else
  16. i++;
  17. }
  18. if (a.size() == 1)
  19. return a[0];
  20. else {
  21. int n, d;
  22. n = a.back();
  23. d = 1;
  24. a.pop_back();
  25. while (a.size() != 0) {
  26. swap(n, d);
  27. n = a.back() * d + n;
  28. a.pop_back();
  29. }
  30. //cout << d << " " << n << endl;
  31. return double(d) / n;
  32. }
  33. }
  34. void compareTwo() {
  35. string A, B;
  36. //cin >> A;
  37. //cin >> B;
  38. getline(cin, A);
  39. getline(cin, B);
  40. double v1 = continuedfraction2fraction(A);
  41. double v2 = continuedfraction2fraction(B);
  42. if (v1 < v2)
  43. cout << ">" << endl;
  44. else
  45. cout << "<" << endl;
  46. }

2018平安科技校园招聘

5道编程题
(1)翻转数字相加
输入: 123 456
输出:975

  1. void reverseNumAdd(){
  2. string a;
  3. string b;
  4. cin>>a>>b
  5. reverse(a.begin(),a.end());
  6. reverse(b.begin(),b.end());
  7. cout<<atoi(a)+atoi(b)<<endl;
  8. }

(2)largest rectangle in histogram 直方图中最大的矩形面积(leetcode原题)
leetcode 84. Largest Rectangle in Histogram
(3)还是leetcode原题
leetcode 127. Word Ladder
(4)求一个无序数组中最小的k个数,保持原有顺序输出
算是剑指offer原题吧,要求尽量O(n)的复杂度

(5)顺时针打印矩阵元素
剑指offer原题,看这里

360校园招聘

很坑啊,选择题30道几乎全是给一段程序求输出结果,字太小,没有缩进,看到崩溃,而且涵盖了C++,java,shell,python各种语言。。。
编程题三道,只来得及做出一道,第二题没写完orz
(1)游乐园问题
一张游乐园的票可以玩t分钟,给一个数组表示n个项目,ai代表第i个项目的时间,求最长可以玩多久。
四舍五入是个0-1背包问题。
除了时间最长的那个项目,共n-1个项目,总时间t-1来求解最优值。
剩余的最后一分钟去玩最长时间的项目。

  1. void playTime() {
  2. int t, n;
  3. cin >> n >> t;
  4. int* time = new int[n]();
  5. for (int i = 0; i < n; i++)
  6. cin >> time[i];
  7. sort(time, time + n);
  8. vector<vector<int>> dp(n, vector<int>(t, 0));
  9. for (int i = 1; i < n; i++) {
  10. for (int j = 1; j <t; j++) {
  11. if (time[i-1] > j)
  12. dp[i][j] = dp[i - 1][j];
  13. else {
  14. if (dp[i - 1][j - time[i-1]] + time[i-1] > dp[i - 1][j])
  15. dp[i][j] = dp[i - 1][j - time[i-1]] + time[i-1];
  16. else
  17. dp[i][j] = dp[i - 1][j];
  18. }
  19. }
  20. }
  21. cout << dp[n-1][t-1]+time[n-1] << endl;
  22. }

(2)障碍的个数
小明玩一个游戏,如果连续三个障碍物的高度是非递减序列,那么视为一个障碍。
给一个数组A[n],n比较大。
一共m个查询,[l,r],要你给出[l,r]间有多少个障碍。m也比较大。

每次查询都去计算一遍是不可行的。
所以我设想的方案是:
首先遍历A数组,找出所有的非递减序列,并存储左右边界
对于m中每个查询L,R,在存储的非递减序列总判断是否有交集,然后障碍个数=交集非递减序列长度-2
大致长这样吧,没得测试了

  1. void queryP() {
  2. int n;
  3. scanf("%d", &n);
  4. int* high = new int[n]();
  5. for (int i = 0; i < n; i++)
  6. scanf("%d", high[i]);
  7. int m;
  8. scanf("%d", &m);
  9. int** que = new int*[m];
  10. for (int i = 0; i < m; i++)
  11. que[i] = new int[2]();
  12. for (int i = 0; i < m; i++)
  13. scanf("%d %d", que[m][0],que[m][1]);
  14. vector<int>left;
  15. vector<int>right;
  16. int l = 0, r = 0;
  17. int i = 0;
  18. while(i<n-2) {
  19. if (high[i] <= high[i + 1])
  20. ++r;
  21. else {
  22. left.push_back(l);
  23. right.push_back(r);
  24. l = i + 1;
  25. }
  26. ++i;
  27. }
  28. int len = left.size();
  29. for (int i = 0; i < m; i++) {
  30. int count = 0;
  31. for (int j = 0; j < len; j++) {
  32. int l = max(que[i][0], left[j]);
  33. int r = min(que[i][1], right[j]);
  34. if (r - l > 2)
  35. count += r - l;
  36. }
  37. cout << count << endl;
  38. }
  39. }

(3)大约是个最短路径问题,没细看

测评 60分钟专业知识
数据结构选择题 3道编程
1)数组第二大的数
一轮比较就可以了

  1. int find_sec_max(int data[], int count) {
  2. if (count < 2)//数组长度小于2,不存在第2大的
  3. return -1;
  4. int first = INT_MIN, second = INT_MIN;
  5. for (int i = 0; i < count; i++) {
  6. if (data[i] > first) {
  7. second = first;
  8. first = data[i];
  9. }
  10. else if (data[i] > second&&data[i] < first)
  11. second = data[i];
  12. }
  13. cout << second << endl;
  14. return second;
  15. }

2)求阶乘,递归
不知道考点在哪里??
3)把数组排成最小的数
剑指offer原题
正式笔试

发表评论

表情:
评论列表 (有 0 条评论,425人围观)

还没有评论,来说两句吧...

相关阅读

    相关 试题

    1、写出几种常见的设计模式,并详细列举出一种。 单例设计模式,工厂设计模式,适配器设计模式,模板设计模式,装饰设计模式 2、描述下tcp接收数据的过程。 1:建立服务器端

    相关 面试试题

     1.写一个函数,返回一个字符串中只出现一次的第一个字符      [第一个只出现一次的字符(包含代码-C++)][-C]     (1)用查找子串的方式,每次遍历一

    相关 试题

    最近做了一些公司的笔试题,将所记部分整理一下。 1、查询该目录及子目录下所有的以.conf为后缀的文件:find . -name “\.conf”由此题扩展到linux的指

    相关 试题

    搜狗2017年校招笔试编程题题目: 在一个圆形上的若干点,点的位置以角度的形式表示,(0-360),输入若干的点的位置,点的距离以劣弧对应角度表示,求距离最远的两个点的角

    相关 华为试题

    今天,帮同学看了到华为的笔试题,题目如下: 举办一场8小时的聚会,时间段从12:00到20:00点,让来访的客人事先填好到达的时间和离开的时间,为了掌握聚会期间的座位数目,需