一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 2271|回复: 37
收起左侧

Google电面,估计跪了,老实去Amazon了

[复制链接] |试试Instant~ |关注本帖
pf22099 发表于 2014-11-1 05:19:32 | 显示全部楼层 |阅读模式

2014(10-12月) 码农类 硕士 全职@Google - 猎头 - 技术电面 |Other

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
话说自从20号拿到了Amazon的offer后直接放马南山,各种吃喝玩乐,题也没刷,啥都没准备,今天就直接电面了。两周没做过题手感全无,写code的时候出了好几个明显的错,唉。

题目其实挺简单,之前面经里就有,就是String Array合成一个String,然后把这个String再拆回到原来的String Array。
给了两个函数public static void String Serialize(String[] input) {}, 和public static void String[] DeSerialize(String input) {},让你实现里面的内容,使得Deserialize(Serialize(x)) == x。

. 1point 3acres 璁哄潧
我给出了两种方法,一个是在合成String的时候在两个String之间加个分隔符(比如+),拆分的时候按照分隔符拆;还有种方法是把每个String写成长度+String的形式,例如[foobar, boo, baz]的结果是6|foobar3|boo3|baz。
但是两种方法都被指出了问题。
第一种方法的问题是如何解决本身字符串里就有分隔符的问题,例如[aaa+++,+++bbb],这咋整,我说加个转义字符,前面那个的结果就是"aaa\+\+\++\+\+\+bbb".
第二种方法的问题是如何读取之前那个代表长度的数字。我刚开始SB了, 直接Integer.parseInt(input),结果立刻被指出万一长度是123你不就读错了么,然后就万分羞愧得改过来了。。


总结这次面试是我所有面试里最糟的一次,没准备果然被虐。Mountain View一日游看来是没戏了。。。 这是我最后一个面试,找工作旅程算是结束了。从九月投简历开始一共面了三家公司,现在拿到自己喜欢的Amazon的offer也算知足了。终于可以扔掉一切跟找工作相关的东西,好好享受入职前的最后半年时光了:)




评分

5

查看全部评分

pro 发表于 2014-11-1 11:24:13 | 显示全部楼层
随便选一个字符当分隔符,比如|……然后再随便选一个字符当转义符号,比如\。然后原来的字符串里凡是碰到这两个字符前面都加转义符。deserialize的时候一个个字符扫过去。读到转义符的时候看后面跟着的符号,如果是那俩特殊字符之一就转换回去。不是就切开。

test: "abc", "bc|d", "bc\d", "ef\\g", "hi\|\|j"
serialize: abc\bc\|d\bc\\d\ef\\\\g\hi\\\|\\\|j
deserialize: abc bc|d bc\d ef\\g hi\|\|j

补充内容 (2014-11-2 13:40):
写错了……serialize之后应该是abc|bc\|d|bc\\d|ef\\\\g|hi\\\|\\\|j
回复 支持 2 反对 0

使用道具 举报

shinichish 发表于 2014-11-1 05:32:52 | 显示全部楼层
楼主好幸福,好好享受!
回复 支持 反对

使用道具 举报

22691482 发表于 2014-11-1 05:41:55 | 显示全部楼层
面三家就Offer,真厉害啊
回复 支持 反对

使用道具 举报

cqx83 发表于 2014-11-1 06:08:54 | 显示全部楼层
大概写了一下,请各位指教

import java.util.*;
public class combineStrings{. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
    public static void main(String[] args) {
                String[] arr = {"abc%cde", "a#aa", "haha"};
                for(String s : arr) {
                        System.out.println(s);
                }. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
                String result = serialize(arr);
                System.out.println(result);
                String[] newArr = deserialize(result);
                for(String s : newArr) {. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
                        System.out.println(s);
                }
        }. 鍥磋鎴戜滑@1point 3 acres
        public static String serialize(String[] arr) {
                StringBuilder sb = new StringBuilder();.鏈枃鍘熷垱鑷1point3acres璁哄潧
                sb.append(arr.length + "#");
                for (String s : arr) {
                        sb.append(s.length() + "%");.鏈枃鍘熷垱鑷1point3acres璁哄潧
                }
                for (String s : arr) {
                        sb.append(s);
                }
                return sb.toString();
        }
        public static String[] deserialize(String s) {
                String[] sizeAndContent = s.split("#");
                int len = Integer.parseInt(sizeAndContent[0]);
                s = s.substring(sizeAndContent[0].length()+1);
                String[] eachSize = s.split("%");
                int[] size = new int[len];. 1point 3acres 璁哄潧
                int total = 0;. from: 1point3acres.com/bbs
                for (int i = 0; i < len; i++) {
                        size[i] = Integer.parseInt(eachSize[i]);
                        total += size[i];
                }
                String content = s.substring(s.length() - total, s.length());. From 1point 3acres bbs
                String[] result = new String[len];. 1point 3acres 璁哄潧
                for (int i = 0; i < len; i++) {
                        result[i] = content.substring(0, size[i]);
                        content = content.substring(size[i]);
                }
                return result;
        }
}
回复 支持 反对

使用道具 举报

Arthur2012 发表于 2014-11-1 06:21:11 | 显示全部楼层
感觉楼上全是trojans。说不定大家都在leavey现在,anyway,大家节日快乐!
我觉得可以把每个单词的每个字符转换成数字,存进serialized string中,然后一个单词内的字符用一种间隔符,不同单词间用另一种间隔符。
比如:
原string集合:"12" "23" "34" "56" "67".鐣欏璁哄潧-涓浜-涓夊垎鍦
serialized之后:94+05+#05+15+#15+25+#35+45+#45+55+#. 鍥磋鎴戜滑@1point 3 acres
回复 支持 反对

使用道具 举报

cqx83 发表于 2014-11-1 06:29:33 | 显示全部楼层
Arthur2012 发表于 2014-10-31 14:21
感觉楼上全是trojans。说不定大家都在leavey现在,anyway,大家节日快乐!
我觉得可以把每个单词的每个字 ...

方法倒是个好方法,不过这样serialize的话string的长度会变得好长
回复 支持 反对

使用道具 举报

Arthur2012 发表于 2014-11-1 06:37:22 | 显示全部楼层
cqx83 发表于 2014-11-1 06:29
方法倒是个好方法,不过这样serialize的话string的长度会变得好长

恩恩,我也觉得自己的方法好low,求其他方法。
回复 支持 反对

使用道具 举报

cqx83 发表于 2014-11-1 06:56:17 | 显示全部楼层
Arthur2012 发表于 2014-10-31 14:37
恩恩,我也觉得自己的方法好low,求其他方法。

我在上面发了个我写的代码,不确定是最好的,不过应该可以用
回复 支持 反对

使用道具 举报

Arthur2012 发表于 2014-11-1 07:03:16 | 显示全部楼层
cqx83 发表于 2014-11-1 06:56. 1point 3acres 璁哄潧
我在上面发了个我写的代码,不确定是最好的,不过应该可以用

我就怕输入的String[] arr中会有arr.length + "#"和s.length() + "%"存在。
比如:String[3] arr
arr[0] = "3#" . From 1point 3acres bbs
arr[1] = "2%". from: 1point3acres.com/bbs
arr[2] =  "2%"
这种的输入
回复 支持 反对

使用道具 举报

xx8833 发表于 2014-11-1 07:27:38 | 显示全部楼层
分隔符是#,那么\\,\#表示原来字符中的\和#。
回复 支持 反对

使用道具 举报

 楼主| pf22099 发表于 2014-11-1 08:19:21 | 显示全部楼层
Arthur2012 发表于 2014-10-31 14:21-google 1point3acres
感觉楼上全是trojans。说不定大家都在leavey现在,anyway,大家节日快乐!
我觉得可以把每个单词的每个字 ...

节日快乐!话说今天校园里各种奇装异服……
回复 支持 反对

使用道具 举报

sally216 发表于 2014-11-1 08:49:08 | 显示全部楼层
这题好像频率挺高的,谢分享。“长度123就读错了”啥意思?
回复 支持 反对

使用道具 举报

 楼主| pf22099 发表于 2014-11-1 09:25:04 | 显示全部楼层
sally216 发表于 2014-10-31 16:49. 鍥磋鎴戜滑@1point 3 acres
这题好像频率挺高的,谢分享。“长度123就读错了”啥意思?

我当时想简单了,以为长度用一个char就表示了,但是面试官提醒我说长度有可能占好几个char,比如input = “12|qwertyuiopas”, 如果直接用Integer.parseInt(input.charAt(0))的话读取到的字符串长度不完整。应该用一个while循环来读。
回复 支持 反对

使用道具 举报

fang_wu 发表于 2014-11-1 09:33:44 | 显示全部楼层
用数字加空格拆分怎么样?比如对于“123”,就可以变成“3 123”,这样不用考虑特殊情况 直接用substring取出,然后立即读下一个string,这样,就不会涉及到string本身了吧
回复 支持 反对

使用道具 举报

cqx83 发表于 2014-11-1 12:12:32 来自手机 | 显示全部楼层
Arthur2012 发表于 2014-10-31 15:03
我就怕输入的String[] arr中会有arr.length + "#"和s.length() + "%"存在。
比如:String[3] arr
arr[ ...

我的代码应该是可以handle这种情况的,你试一下
回复 支持 反对

使用道具 举报

cqx83 发表于 2014-11-1 12:24:09 | 显示全部楼层
Arthur2012 发表于 2014-10-31 15:03
我就怕输入的String[] arr中会有arr.length + "#"和s.length() + "%"存在。
比如:String[3] arr
arr[ ...

你大概没仔细看我的方法。。
回复 支持 反对

使用道具 举报

yhfyhf 发表于 2014-11-1 12:30:34 | 显示全部楼层
为什么会有半年的时光,既不用上课也不用工作吗?那不能提早入职吗?纯小白,问的问题比较白痴....
回复 支持 反对

使用道具 举报

dmsehuang 发表于 2014-11-1 13:03:49 | 显示全部楼层
pro 发表于 2014-11-1 11:24
随便选一个字符当分隔符,比如|……然后再随便选一个字符当转义符号,比如\。然后原来的字符串里凡是碰到这 ...

pro的solution可以啊。
回复 支持 反对

使用道具 举报

Arthur2012 发表于 2014-11-1 13:07:23 | 显示全部楼层
cqx83 发表于 2014-11-1 12:24
你大概没仔细看我的方法。。

恩恩,这次看明白啦,谢谢cqx
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-3 20:16

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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