📣 独立日限时特惠: VIP通行证立减$68
楼主: shabixia
跳转到指定楼层
上一主题 下一主题
收起左侧

工作一年半在职跳槽,分享一波面经+经验,求加精

   
全局:
Google第一题:
每个点 每个长度挨着试 不知道有没有更简单的方法了
  1. public class Solution1 {
  2.     int res;
  3.     int rows;
  4.     int cols;
  5.     int[][] data;
  6.     public int solve(int[][] data) {
  7.         if(data==null||data.length==0||data[0].length==0) return 0;
  8.         this.rows = data.length;
  9.         this.cols = data[0].length;
  10.         this.res = 0;
  11.         this.data = data;
  12.         for(int i = 0; i<data.length; i++){
  13.             for(int k = 0; k<data[i].length; k++){
  14.                 if(data[i][k]==1)
  15.                     helper(i, k, 1);
  16.             }
  17.         }
  18.         return res;
  19.     }
  20.     private void helper(int i, int k, int len) {
  21.         boolean flag = true;
  22.         if(i+len >=rows || k + len>=cols){
  23.             return;
  24.         }
  25.         for (int ii = i; ii <= i + len; ii++) {
  26.             if (data[ii][k] != 1 || data[ii][k + len] != 1) {
  27.                 flag = false;
  28.                 break;
  29.             }
  30.         }
  31.         for (int ii = k; ii <= k + len; ii++) {
  32.             if (data[i][ii] != 1 || data[i + len][ii] != 1) {
  33.                 flag = false;
  34.                 break;
  35.             }
  36.         }
  37.         if(flag) res++;
  38.         helper(i, k, len+1);
  39.     }
  40. }
复制代码


跑了两个 问题不大
        int[][] nums2D1 = {{1,1,1,1},{1,0,1,1},{1,1,1,1}};    ----> 3
        int[][] nums2D2 = {{0,0,1,1,1,1},{0,0,1,1,1,1},{1,1,1,1,0,1},{1,1,1,1,1,1}};   ----> 9
回复

使用道具 举报

🔗
 楼主| shabixia 2017-1-6 07:28:17 | 只看该作者
全局:
吃啥才算成熟 发表于 2017-1-6 07:17
Google第一题:
每个点 每个长度挨着试 不知道有没有更简单的方法了

粗看了一下你这是O(n^4)? 最好应该是O(n^3),先算一下每个点最远走多远,然后便利一遍每个点,数一下长度分别为1,2,3...的正方形
回复

使用道具 举报

全局:
Google 第二题
add是O(1)所以输入很多应该没所谓。
但要是k很大。。。list就会很大 而且size*cur也有可能overflow 没想好有什么好办法
  1. public class Solution2 {
  2.     LinkedList<Integer> list;
  3.     int k;
  4.     double cur;
  5.     public Solution2(int k){
  6.         this.list = new LinkedList<Integer>();
  7.         this.k = k;
  8.         this.cur = 0;
  9.     }

  10.     public double add(int input) {
  11.         int size = list.size();
  12.         if (size == k) {
  13.             int first = list.pollFirst();
  14.             cur = (size * cur + input - first)/(double)size;
  15.         } else {
  16.             cur = (size * cur + input)/(double)(size+1);
  17.         }
  18.         list.add(input);
  19.         return cur;
  20.     }
  21. }
复制代码
回复

使用道具 举报

全局:
shabixia 发表于 2017-1-6 07:28
粗看了一下你这是O(n^4)? 最好应该是O(n^3),先算一下每个点最远走多远,然后便利一遍每个点,数一下长度 ...

恩是一样的 O(n3)
回复

使用道具 举报

全局:
google onsite (1):

因为input不需要sorted,要是tree或者graph,就多个travel,一个个输入就行,和array道理一样
  1. import java.util.*;

  2. public class Solution3 {
  3.     public int solve(int[] input){//input 不需要sorted
  4.         Map<Integer, Integer> map = new HashMap<>();
  5.         int max = 0;
  6.         for(int i = 0; i<input.length; i++){
  7.             int left = map.getOrDefault(input[i] - 1, 0);
  8.             int right = map.getOrDefault(input[i] + 1, 0);
  9.             int sum = left + right + 1;
  10.             max = Math.max(sum, max);

  11.             map.put(input[i] - left, sum);
  12.             map.put(input[i] + right, sum);
  13.         }
  14.         return max;
  15.     }
  16. }
复制代码

补充内容 (2017-1-6 07:56):
{10,1,-123,7,214,6,51,15,23,4513,5,14,8,61,9,2}; ---> 6   (5, 6, 7, 8, 9, 10)
回复

使用道具 举报

全局:
google onsite 2:

  1. import java.util.*;

  2. public class Solution4 {
  3.     List<Iterator<Integer>> list;
  4.     int cur;
  5.     int size;
  6.     public Solution4(List<Iterator<Integer>> list){
  7.         this.list = list;
  8.         this.cur = 0;
  9.         this.size = list.size();
  10.     }

  11.     public int next(){
  12.         hasNext();
  13.         int res = list.get(cur).next();
  14.         cur = (cur+1)%size;
  15.         return res;
  16.     }
  17.     public boolean hasNext(){
  18.         int pre = cur;
  19.         while(!list.get(cur).hasNext()){
  20.             cur = (cur+1)%size;
  21.             if(cur==pre) return false;
  22.         }
  23.         return true;
  24.     }
  25. }
复制代码


test:
  1.         Integer[] nums1 = {3,5,10,3};
  2.         Integer[] nums2 = {1,2};
  3.         Integer[] nums3 = {};
  4.         Integer[] nums4 = {3,1,54,5,12,44};

  5.         List<Iterator<Integer>> list = new ArrayList<>();
  6.         list.add(Arrays.asList(nums1).iterator());
  7.         list.add(Arrays.asList(nums2).iterator());
  8.         list.add(Arrays.asList(nums3).iterator());
  9.         list.add(Arrays.asList(nums4).iterator());
  10.         Solution4 s = new Solution4(list);
  11.         while(s.hasNext()){
  12.             System.out.print(s.next() + " ");
  13.         }
复制代码

output: 3 1 3 5 2 1 10 54 3 5 12 44
回复

使用道具 举报

全局:
google onsite 3:
直接方法: 但复杂度高。
  1. //给一个string和一列word,求最长长度的substring,比如string是abcde,然后word是abe,bc,aaaa,那最长的就是abe,followup是string特别长怎么办
  2. public class Solution5 {
  3.     public String solve(String str, String[] words){
  4.         int max = 0;
  5.         String res = "";
  6.         for(String ss: words){
  7.             if(ss.length() > max && sub(str, ss)){
  8.                 max = ss.length();
  9.                 res = ss;
  10.             }
  11.         }
  12.         return res;
  13.     }
  14.     private boolean sub(String s1, String s2){
  15.         char[] c1 = s1.toCharArray();
  16.         char[] c2 = s2.toCharArray();
  17.         int p = 0;
  18.         for(int i = 0; i<c1.length; i++){
  19.             if(p==c2.length) break;
  20.             if(c1[i] == c2[p]) p++;
  21.         }
  22.         return p == c2.length;
  23.     }
  24. }
复制代码

补充内容 (2017-1-6 08:31):
String[] strs1 = {"a","aae","bc","abd","abe","bca","aaaa",};
        Solution5 s = new Solution5();
        String res = s.solve("abcde", strs1);

补充内容 (2017-1-6 08:36):
改进用KMP
回复

使用道具 举报

🔗
gameboyying 2017-1-6 08:46:17 | 只看该作者
全局:
给你一个folder的路径,然后写个method删除该folder下所有内容相同的文件

这个怎么写? 有代码吗?
回复

使用道具 举报

全局:
google onsite 3. 扫一遍string 用一个map存index。
能快一些。但总觉得是不是哪里还是麻烦了?有更好的方法么

  1.     public String solve2(String str, String[] words){
  2.         Map<Character, LinkedList<Integer>> map = process(str);
  3.         int max = 0;
  4.         String res = "";
  5.         for(String ss: words){
  6.             if(ss.length() > max){
  7.                 Map<Character, LinkedList<Integer>> tmp = copyMap(map);
  8.                 int cur = 0;
  9.                 boolean flag = true;
  10.                 for(char c: ss.toCharArray()){
  11.                     if(!tmp.containsKey(c) || tmp.get(c).size()==0){
  12.                         flag = false;
  13.                         break;
  14.                     }
  15.                     int p = tmp.get(c).pollFirst();
  16.                     if( p < cur ){
  17.                         flag = false;
  18.                         break;
  19.                     }
  20.                     cur = p;
  21.                 }
  22.                 if(flag){
  23.                     max = ss.length();
  24.                     res = ss;
  25.                 }
  26.             }
  27.         }
  28.         return res;
  29.     }

  30.     private Map<Character, LinkedList<Integer>> copyMap(Map<Character, LinkedList<Integer>> map){
  31.         Map<Character, LinkedList<Integer>> tmp = new HashMap<>();
  32.         for(Map.Entry<Character, LinkedList<Integer>> me: map.entrySet()){
  33.             tmp.put(me.getKey(), new LinkedList<>(me.getValue()));
  34.         }
  35.         return tmp;
  36.     }

  37.     private Map<Character, LinkedList<Integer>> process(String str){
  38.         Map<Character, LinkedList<Integer>> map = new HashMap<>();
  39.         char[] chars = str.toCharArray();
  40.         for(int i = 0; i<chars.length; i++){
  41.             map.computeIfAbsent(chars[i], k->new LinkedList<Integer>()).add(i);
  42.         }
  43.         return map;
  44.     }
复制代码



String[] strs1 = {"a","aae","bc","adbe","abe","bca","aaaa"};
Solution5 s = new Solution5();
String res = s.solve2("abcde", strs1);  -----> abe

补充内容 (2017-1-6 09:44):
尤其用林kedlist存相同字母的每个index 和copymap哪里。不知道有没有什么更好的方法?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表