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

FB onsite 挂经 非典型coding

🔗
leonxxx 2017-5-20 13:38:34 | 只看该作者
全局:
翻滚吧豆子 发表于 2017-5-20 13:24
给的提示非常有意义,比如 sum = A + A'
A'是A去掉任意一位。那么可以看成是两部分相加:
sum = (A1 +  ...

why not divide by 11,110,1100,11000,....
回复

使用道具 举报

全局:
leonxxx 发表于 2017-5-20 13:38
why not divide by 11,110,1100,11000,....

能给出你具体的方法吗?
回复

使用道具 举报

🔗
leonxxx 2017-5-20 14:15:31 | 只看该作者
全局:
翻滚吧豆子 发表于 2017-5-20 13:45
能给出你具体的方法吗?

it has multiple answers.

say 43763+4363=48126;
44063+4063
43813+4313

my thoughts is

divided 11; see if it can abcd+abc;
divided 110; see if can abcd+abd
divided by 1100, see if can abcd+acd;
etc.
回复

使用道具 举报

全局:
leonxxx 发表于 2017-5-20 14:15
it has multiple answers.

say 43763+4363=48126;

嗯嗯,我觉得可行,和我的想法基本一样。要想想怎么处理
abcd+acd 而cd+cd进位的情况
回复

使用道具 举报

全局:
dlf1601 发表于 2017-5-20 13:30
再请教一下,第一题copy on write class是考thread safe吗?
是不是这样就行了?。。

- -我觉得你这个有点不对劲。。。。
java的string都是不能修改的,所以按这么每次write,即便你不费这功夫,他也是会new 一个对象

这道题我猜测肯定要上StringBuffer或者StringBuilder或者char[]
回复

使用道具 举报

🔗
dlf1601 2017-5-21 03:52:23 | 只看该作者
全局:
翻滚吧豆子 发表于 2017-5-20 16:07
- -我觉得你这个有点不对劲。。。。
java的string都是不能修改的,所以按这么每次write,即便你不费这功 ...

用char[] buffer在write的时候也是先copy一份出来再在copy的那份上write吧, 把a指向新的obj, b还是指向老的obj
回复

使用道具 举报

全局:
dlf1601 发表于 2017-5-21 03:52
用char[] buffer在write的时候也是先copy一份出来再在copy的那份上write吧, 把a指向新的obj, b还是指向 ...

但是你要记住有多少个reference啊。
如果对string a只有一个引用,然后这时候要修改,那我直接就在原地改了,不用复制
回复

使用道具 举报

🔗
liliphy 2017-5-21 06:49:05 | 只看该作者
全局:
n2是n1少一位digit,输入s=n1 + n2, 求(n1, n2)的可能解

123456
   ^
   e
^^^ ^^
h   t

e为去掉的digit
h为前缀
t为后缀

s = 2 * t + (11 * h + e) * 10^r
= 2 * t + e * 10^r + h * 11 * 10^r

注意2 * t < 10^r, 0 <= e <= 9

尝试不同的r
h = s / (11 * 10^r)
e * 10^r + 2 * t = s % (11 * 10 ^ r)
e = (s % (11 * 10 ^ r)) / 10 ^ r
t = ((s % (11 * 10 ^ r)) % 10 ^ r) / 2

复杂度log(s)
  1. def findn1n2(s):
  2.     if s < 10: return [(s, 0)]
  3.     rec = set()
  4.     r = 0
  5.     while s / (11 * 10 ** r):
  6.         h = s / (11 * 10 ** r)
  7.         m = s % (11 * 10 ** r)
  8.         e = m / (10 ** r)
  9.         t = (m % (10 ** r)) / 2
  10.         n1 = h * 10 ** (r + 1) + e * 10 ** r + t
  11.         n2 = h * 10 ** r + t
  12.         rec.add((n1, n2))
  13.         r += 1
  14.     return list(rec)

  15. print findn1n2(2) #[(2, 0)]
  16. print findn1n2(39) #[(36, 3)]
  17. print findn1n2(1246) #[(1133, 113), (1123, 123)]
复制代码
回复

使用道具 举报

全局:
liliphy 发表于 2017-5-21 06:49
n2是n1少一位digit,输入s=n1 + n2, 求(n1, n2)的可能解

123456

兄弟你这个挺好,貌似就是有个case没考虑,低位相加有可能进位的
比如
输入1346,应该输出
1224, 122
1223, 123
1218,     128
1173,     173
但你这个只输出了
[(1223, 123), (1224, 122)]
回复

使用道具 举报

🔗
liliphy 2017-5-21 10:24:05 | 只看该作者
全局:
翻滚吧豆子 发表于 2017-5-21 07:04
兄弟你这个挺好,貌似就是有个case没考虑,低位相加有可能进位的
比如
输入1346,应该输出

说的没错,我重新考虑了一下
  1. def findn1n2(s):
  2.     if s < 10: return [(s, 0)]
  3.     rec = set()
  4.     base = 1
  5.     while s / (11 * base):
  6.         h = s / (11 * base)
  7.         m = s % (11 * base)
  8.         e = 0
  9.         while e * base <= m:
  10.             if (m - e * base) % 2 == 0 and (m - e * base) / 2 < base:
  11.             t = (m - e * base) / 2
  12.             n1 = h * 10 * base + e * base + t
  13.             n2 = h * base + t
  14.             rec.add((n1, n2))
  15.         e += 1
  16.     base *= 10
  17.     return list(rec)

  18. print findn1n2(2) #[(2, 0)]
  19. print findn1n2(39) #[(36, 3)]
  20. print findn1n2(1246) #[(1073, 173), (1133, 113), (1123, 123), (1128, 118)]
  21. print findn1n2(1346) #[(1218, 128), (1173, 173), (1224, 122), (1223, 123)]
复制代码
回复

使用道具 举报

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

本版积分规则

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