回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

aws 湾区 onsite

全局:

2019(7-9月) 码农类General 本科 全职@amazon - 猎头 - Onsite  | | Fail | 在职跳槽

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x

邮件说六轮面试,后来面试当天早上发邮件说schedule改了,变成了五轮,第一轮推迟了一个小时。

第一轮:bar raiser,华人,有一个人远程 shadow。全程bq,感觉答得还行,没有特别techinical,但是需要具体举很多例子。给自己打分 hire。
第二轮:午饭,南亚姐姐,感觉挺友善,就是还是不习惯,南亚人表示yes是摇头晃脑,有时候感觉有点confusing
第三轮:换了面试房间,但是午饭的南亚姐姐并不知道,后来联系了第三轮的面试官才
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
出来了这个题目。后来发现是李口原题。这轮算是比较正常的一轮。有交流,面试官比之前两个态度好多了。给自己打分 hire/weak hire

总结:aws虽说有食堂,真的差也不是免费。被南亚人占领的组别去,即使去了,也会干的很憋屈。我面aws看中的点就是学东西,成长,包还不错。但千万别以自己 身体和心理的健康为代价,不值得。

评分

参与人数 5大米 +37 收起 理由
kevinatsf + 2 给你点个赞!
匿名用户-QABHP + 30
X88 + 2 很有用的信息!
rocketman2023 + 1 赞一个
onion1222 + 2 赞一个!

查看全部评分


上一篇:Yelp 面经总结 HR/Phone/Onsite
下一篇:blackRock OA
推荐
magicsets 2019-9-9 14:00:52 | 只看该作者
全局:
本帖最后由 magicsets 于 2019-9-9 14:19 编辑
wujiandaoxy 发表于 2019-9-8 11:00
请问下打印程序自身内容的具体实现思路是啥呢?

我写一下具体怎么构造吧,其实关键点只有一个
构造一个“数据区”,使得该数据区的文本(literal)可以由数据的值(value)构造出来。

下面用Python3举一个例子,首先程序框架是这样的:

  1. # 数据区就是下面三引号包起来的部分
  2. # 数据区里可能包含一些转义字符,这里我们需要注意两种
  3. # (1) 数据区内的三引号需要在前面加上反斜杠:''' -> \'''
  4. # (2) 数据区内的反斜杠自身也要加上反斜杠:\ -> \\
  5. data = '''\
  6. THIS IS DATA SEGMENT
  7. '''

  8. # 由数据的"值"生成数据的"文本"
  9. # multi-line string的处理还是比较简单的,字符串的值本身就对应了代码,只是我们要还原转义字符
  10. def generate_data_segment(data):
  11.     return data.replace('\\', '\\\\').replace("'''", "\\'''")

  12. # 将数据区的Token替换为数据的文本,打印即可
  13. print(data.replace("THIS IS " + "DATA SEGMENT\n", generate_data_segment(data)), end = '')
复制代码


可以看出代码框架除去注释外只有很少几行代码,由三部分构成
(1) 数据区,一般是一个多行的字符串,也可以用数组或者随便什么文本表示上有规律的数据结构
(2) 一个将数据的“值”(value)转换为数据的文本表示(literal)的函数
(3) 将数据区中数据的token替换为数据的文本表示,并输出

其中(2)、(3)部分可以任意构造,也就是说除了数据区那个字符串以外,外面部分想怎么写就怎么写。

现在,框架代码还不是一个Quine,执行它的话只会打出 THIS IS DATA SEGMENT 这么一句话

下面就是关键部分了:复制整个程序,将其填入数据区,然后对数据区内所有 反斜线\ 三引号''' 进行转义(也就是多加个反斜线),这样我们就得到了一个Quine:

  1. # 数据区就是下面三引号包起来的部分
  2. # 数据区里可能包含一些转义字符,这里我们需要注意两种
  3. # (1) 数据区内的三引号需要在前面加上反斜杠:''' -> \'''
  4. # (2) 数据区内的反斜杠自身也要加上反斜杠:\ -> \\
  5. data = '''\
  6. # 数据区就是下面三引号包起来的部分
  7. # 数据区里可能包含一些转义字符,这里我们需要注意两种
  8. # (1) 数据区内的三引号需要在前面加上反斜杠:\''' -> \\\'''
  9. # (2) 数据区内的反斜杠自身也要加上反斜杠:\\ -> \\\\
  10. data = \'''\\
  11. THIS IS DATA SEGMENT
  12. \'''

  13. # 由数据的"值"生成数据的"文本"
  14. # multi-line string的处理还是比较简单的,字符串的值本身就对应了代码,只是我们要还原转义字符
  15. def generate_data_segment(data):
  16.     return data.replace('\\\\', '\\\\\\\\').replace("\'''", "\\\\\'''")

  17. # 将数据区的Token替换为数据的文本,打印即可
  18. print(data.replace("THIS IS " + "DATA SEGMENT\\n", generate_data_segment(data)), end = '')
  19. '''

  20. # 由数据的"值"生成数据的"文本"
  21. # multi-line string的处理还是比较简单的,字符串的值本身就对应了代码,只是我们要还原转义字符
  22. def generate_data_segment(data):
  23.     return data.replace('\\', '\\\\').replace("'''", "\\'''")

  24. # 将数据区的Token替换为数据的文本,打印即可
  25. print(data.replace("THIS IS " + "DATA SEGMENT\n", generate_data_segment(data)), end = '')
复制代码


通过这个代码框架应该比较容易看出来具体的原理了:
(1) 数据区的值包含了除去数据区自身代码文本以外的所有代码文本
(2) 数据区的代码文本可以由数据区的值构造出来

(1)和(2)嵌接起来就得到了整个程序 —— 这个嵌接也有不同的实现方式,比如上面的代码用了 "THIS IS DATA SEGMENT" 这么个token进行替换

然后这个框架适用于大部分可以定义字符串/函数并输出字符串的语言,例如C++、Java、Python、Javascript,R甚至Matlab之类的
回复

使用道具 举报

推荐
magicsets 2019-9-8 03:43:55 | 只看该作者
全局:
打印自己的程序也叫做Quine

Quine有很多写法,不过一般不能用"读入源代码文件并打印"这样的方法,因为这依赖了程序自身以外的数据 —— 如果执行环境发生变化(例如换台机器或者换个磁盘)同样的代码就不work了。

然后这个问题涉及比较深刻的一点是如下定理:

作为计算理论中Kleene's recursion theorem的一个推论,在任意一个图灵完备的语言中都可以写出打印其自身的代码
回复

使用道具 举报

🔗
wujiandaoxy 2019-9-8 11:00:46 | 只看该作者
全局:
请问下打印程序自身内容的具体实现思路是啥呢?
回复

使用道具 举报

全局:
请问lz用的什么语言呢?打印自己要用到读写文件的function,能现场查嘛?
回复

使用道具 举报

🔗
 楼主| popgdp 2019-9-9 08:59:16 | 只看该作者
全局:
magicsets 发表于 2019-9-8 03:43
打印自己的程序也叫做Quine

Quine有很多写法,不过一般不能用"读入源代码文件并打印"这样的方法,因为这 ...

大神你太强了!
回复

使用道具 举报

🔗
magicsets 2019-9-9 14:17:50 | 只看该作者
全局:
magicsets 发表于 2019-9-9 14:00
我写一下具体怎么构造吧,其实关键点只有一个
构造一个“数据区”,使得该数据区的文本(literal)可以 ...

再贴一份Java代码的例子,首先是框架:

  1. public class Quine {
  2.   public static void main(String[] args) {
  3.     String data =
  4. /* ====== 数据区开始 ====== */
  5. "THIS IS DATA SEGMENT\n" +
  6. /* ====== 数据区结束 ====== */"";

  7.     System.out.print(data.replace("THIS IS " + "DATA SEGMENT\n", GenerateDataSegment(data)));
  8.   }
  9.   
  10.   public static String GenerateDataSegment(String data) {
  11.     StringBuilder sb = new StringBuilder();
  12.     for (String line : data.split("\n")) {
  13.       String escaped = line.replace("\\",  "\\\\").replace("\"", "\\\"");
  14.       sb.append('"' + escaped + "\\n\" +\n");
  15.     }
  16.     return sb.toString();
  17.   }
  18. }
复制代码


复制整个程序,并填入数据区就可以得到Quine,注意这里因为使用了字符串拼接的方式构造数据区,所以填入的程序每一行都要按照这样的格式排版,也就是前后加双引号以及\n和加号,然后escape相关的字符,并且数据区的那个“THIS IS DATA SEGMENT" token要保持在框架代码中的格式。

  1. public class Quine {
  2.   public static void main(String[] args) {
  3.     String data =
  4. /* ====== 数据区开始 ====== */
  5. "public class Quine {\n" +
  6. "  public static void main(String[] args) {\n" +
  7. "    String data = \n" +
  8. "/* ====== 数据区开始 ====== */\n" +
  9. "THIS IS DATA SEGMENT\n" +
  10. "/* ====== 数据区结束 ====== */\"\";\n" +
  11. "\n" +
  12. "    System.out.print(data.replace(\"THIS IS \" + \"DATA SEGMENT\\n\", GenerateDataSegment(data)));\n" +
  13. "  }\n" +
  14. "  \n" +
  15. "  public static String GenerateDataSegment(String data) {\n" +
  16. "    StringBuilder sb = new StringBuilder();\n" +
  17. "    for (String line : data.split(\"\\n\")) {\n" +
  18. "      String escaped = line.replace(\"\\\\\",  \"\\\\\\\\\").replace(\"\\\"\", \"\\\\\\\"\");\n" +
  19. "      sb.append('\"' + escaped + \"\\\\n\\\" +\\n\");\n" +
  20. "    }\n" +
  21. "    return sb.toString();\n" +
  22. "  }\n" +
  23. "}\n" +
  24. /* ====== 数据区结束 ====== */"";

  25.     System.out.print(data.replace("THIS IS " + "DATA SEGMENT\n", GenerateDataSegment(data)));
  26.   }
  27.   
  28.   public static String GenerateDataSegment(String data) {
  29.     StringBuilder sb = new StringBuilder();
  30.     for (String line : data.split("\n")) {
  31.       String escaped = line.replace("\\",  "\\\\").replace("\"", "\\\"");
  32.       sb.append('"' + escaped + "\\n\" +\n");
  33.     }
  34.     return sb.toString();
  35.   }
  36. }
复制代码

评分

参与人数 1大米 +2 收起 理由
whicter + 2 好厉害..

查看全部评分

回复

使用道具 举报

全局:
为何六轮?oa结束之后六轮?
回复

使用道具 举报

🔗
 楼主| popgdp 2019-9-13 14:25:57 | 只看该作者
全局:
后来改成五轮了,包括吃饭五轮
回复

使用道具 举报

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

本版积分规则

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