2018百度android方向校招编程题
来源:互联网 发布:某路口车流量数据 编辑:程序博客网 时间:2024/06/02 19:10
晚上参加百度的校招,一共三道题。
第一道
给定一个数组,要求根据出公式计算,打印计算结果。
sum = a0 + 1/(a1+1/(a2+1/(a3+…+1/(an)))
下面是我的代码,运用递归思想。通过了90%,剩下的10%,应该是得处理精度,时间有点急,这道题因为一些细节花好多时间,一看过了90%,马上就跳下一题,后来回顾,才知道问题再这。
处理精度只需要判断两个相减小于0.00001,就判断相等。这样就OK了。要处理精度是因为计算机是二进制表示数据的,所以有时候两个数明明相等,计算比较出来却不是相等。
import java.util.Scanner;public class Main {public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] a = getInt(scanner.nextLine().split(" ")); double x = getInt1(a,0); int[] b = getInt(scanner.nextLine().split(" ")); double y = getInt1(b,0); String temp = "="; if(x > y){ temp =">"; }else if(y < y){ temp = "<"; } System.out.println(temp);// int[] c = {0,1,2,8};// System.out.println(getInt1(c, 0));// System.out.println(17D/25);}private static double getInt1(int[] a,int k) { if(k == a.length-1){ int temp2 = a[k]; return temp2; }else if(k > a.length-1){ return 0; } double temp = a[k]; double temp1 = getInt1(a,k+1); return temp + 1d/temp1;}private static int[] getInt(String[] split) { int[] a = new int[split.length]; for(int i = 0; i < split.length;i++){ a[i] = Integer.valueOf(split[i]); } return a;}}
第二题
给定一个字符串,只包含“W”或者”E”,W属于左边,E属于右边。现在要让你给字符串划成左边和右边,使得W在右边的数量加上E在右边的数量的和最少。注:可全部划为左边或者全部化为右边。
例如:
WWWEE:在第三个W之后划为右边,之前划为左边,和就为0。
WWEWWEEW:在第四个W之后划为右边,之前划为左边,那么有一个。
E跑到左边去了,一个W跑到右边去了,所以和为2
WWW:全部划左边,和就为0。
我的思路是:用动态规划的思想去做。先把计算全部划左边的和,然后计算下一种状态。AC了
import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); int[] min = new int[s.length()]; int min1 = Integer.MAX_VALUE; for(int j = 0; j < s.length();j++){ String temp = s.substring(j,j+1); if(temp.equals("W")){ min[0]++; } } for(int i = 0; i < s.length();i++){ String temp1 = s.substring(i,i+1); if(temp1.equals("W")){ if(i != 0){ min[i] = min[i-1] - 1; }else{ if(min[0] > 0){ min[0]--; } } }else{ if(i != 0) min[i] = min[i-1] + 1; else{ min[0]++; } } } for(int i = 0; i < s.length();i++){ if(min[i] < min1){ min1 = min[i]; } } System.out.println(min1); }}
第三题
给一个N,和一个C。
N代表是N*N矩阵,C代表矩阵的打印模式。
假如N为3;
当C=1时,数组为:
1 2 3
6 5 4
7 8 9
当C=2时,数组为:
1 6 7
2 5 8
3 4 9
当C=3时,数组为:
1 2 3
8 9 4
7 6 5
当C=4时,数组为:
1 8 7
2 9 6
3 4 5
这道题因为时间不够,只写出了前两种矩阵模式,过了50%,再给我15分钟就算出来了。事实上,看似是四种矩阵,第一种和第二种、第三种和第四种几乎是一模一样的。
我是暴力去把数组的计算出来,时间和空间的复杂度都挺高的,所以我下面的代码有可能会内存超限或者时间超时,我总觉得,有时间复杂为O(n)的办法,我就是用了太多时间去找这个办法导致的代码写不全的……
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); int c = scanner.nextInt(); if (c == 1) { printfOne(N); } else if (c == 2) { printfTow(N); } else if (c == 3) { printfThree(N); } else if(c == 4){ printfFrou(N); } } private static void printfFrou(int n) { int[][] a = new int[n][n]; int count = 0; int i = -1; int j = 0; while (true) { if (count >= n * n) { break; } while (count < n * n) { i++; if (i <n&&a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } i--; while (count < n * n) { j++; if (j < n && a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } j--; while (count < n * n) { i--; if (i >= 0 && a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } i++; while (count < n * n) { j--; if (j >= 0 && a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } j++; } print(a); } private static void printfThree(int n) { int[][] a = new int[n][n]; int count = 0; int i = 0; int j = -1; while (true) { if (count >= n * n) { break; } while (count < n * n) { j++; if (j < n && a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } j--; while (count < n * n) { i++; if (i <n&&a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } i--; while (count < n * n) { j--; if (j >= 0 && a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } j++; while (count < n * n) { i--; if (i >= 0 && a[i][j] == 0) { count++; a[i][j] = count; }else{ break; } } i++; } print(a); } private static void printfTow(int n) { int[][] a = new int[n][n]; int count = 1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i % 2 == 0) { a[j][i] = count; count++; } else { a[n - j - 1][i] = count; count++; } } } print(a); } private static void printfOne(int n) { int[][] a = new int[n][n]; int count = 1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i % 2 == 0) { a[i][j] = count; count++; } else { a[i][n - j - 1] = count; count++; } } } print(a); } static void print(int[][] a) { for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } }}
记录一下,如果你有更好的办法,欢迎交流啊。
- 2018百度android方向校招编程题
- 2017 百度校招 编程题
- 美团2017校招客户端方向编程题
- 2015百度校招笔试题(移动软件开发方向)
- 【优先队列】百度2018校招编程题—序列合并
- 2017百度春招编程题
- 百度2017春招实习生编程题
- 百度2017春招实习生编程题
- 百度2017秋招笔试编程题
- 百度2017春招编程题
- 百度前端秋招笔试编程题
- 百度2017秋招笔试编程题
- 百度校招笔试题
- 百度校招笔试题
- 2015-腾讯校招实习-android移动客户端方向
- 秋招公司真题详解(Android方向)
- 百度校招2018笔试题第三题
- 2018百度校招、腾讯校招 面试经验
- 小程序踩坑
- 在ArcMap中内容列表的图层展示,图层顺序是怎么来的?
- Leetcode 134. Gas Station 解题报告
- poj 1754 I Hate It 线段树
- Longest Substring Without Repeating Characters
- 2018百度android方向校招编程题
- 3.字符串反转
- 输入两个整数n和m,从0-n中随意取几个数,使其和等于m
- 手势识别(业余知识 )2017/9/19
- 共享锁和排它锁
- 整数求和
- 迅雷前端笔试题
- ceshi
- js 原型继承 Prototype