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

骨骼 OV 挂经 求米安抚

🔗
vinf 2020-7-31 14:17:11 来自APP | 只看该作者
全局:
这个可以用 dp 来做,定义 dp[i][k1][k2][k3][j][l] 代表考虑了数字1~i,i 还有k1个,i-1还有k2个,i-2还有k3个,以i结尾的顺子还有j个,有l个对子,是否是可行的。

每次转移可以选 2 个 i 组成对子,3个i组成碰子,给之前的顺子续命,以及三个连续数字组成新的顺子。
最后看 dp[n][0][0][0][0][1] 是否是合法的即可。

假设数字范围是 n,每个数字最多的数量是 k,状态数是 n*k^4*2

转移的时候选择给多少顺子续命是O(k)的,剩下都是O
(1)的,所以整体复杂度是O(n*k^5)
回复

使用道具 举报

🔗
zvzv1919 2020-7-31 14:21:36 | 只看该作者
全局:
本帖最后由 zvzv1919 于 2020-7-31 14:37 编辑

试了一下,确实想不到更好的解法了。。这时间复杂度似乎是exponential啊edit:因为有memo,应该是polynomial
  1. def canHu(s: str) -> bool:
  2.     n = len(s)
  3.     card_count = [0 for i in range(10)]
  4.     for i in range(n):
  5.         card_count[int(s[i])] += 1

  6.     def dfs(counts):
  7.         print(counts)
  8.         if sum(counts) == 0:
  9.             return True
  10.         str_form = ''
  11.         for i in range(1, 10):
  12.             str_form += str(counts[i])
  13.         if str_form in memo:
  14.             return False
  15.         ans = False
  16.         for i in range(1, 10):
  17.             if counts[i] > 3:
  18.                 counts[i] -= 3
  19.                 ans = ans or dfs(counts)
  20.                 counts[i] += 3
  21.             if i >= 3 and counts[i] > 0 and counts[i - 1] > 0 and counts[i - 2] > 0:
  22.                 counts[i] -= 1
  23.                 counts[i - 1] -= 1
  24.                 counts[i - 2] -= 1
  25.                 ans = ans or dfs(counts)
  26.                 counts[i] += 1
  27.                 counts[i - 1] += 1
  28.                 counts[i - 2] += 1
  29.         if not ans:
  30.             memo[str_form] = True
  31.         return ans

  32.     memo = {}
  33.     for i in range(1, 10):
  34.         if card_count[i] >= 2:
  35.             card_count[i] -= 2
  36.             if dfs(card_count):
  37.                 return True
  38.             card_count[i] += 2

  39.     return False
复制代码
[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

回复

使用道具 举报

🔗
相位疯脸 2020-7-31 15:05:11 | 只看该作者
全局:
最近跳槽感觉国人如果不是大牛的话,在美国只有两种情况面试过的概率较高。

1. 大厂常规面试,面试官里国人多一些,或者遇到人比较nice的其他族裔面试官。
2. 不管什么厂,组里确实大量缺人的情况。

个人经验就是组里不缺人,再加上没有国人面试官基本就是面成啥样都挂。疫情期间第二条没了,基本纯拼运气了。

心态放平,move on吧。
回复

使用道具 举报

🔗
旧未来 2020-7-31 23:14:28 | 只看该作者
全局:
zvzv1919 发表于 2020-7-31 13:38
诶,你那个greedy的话11111111算胡牌吗?

算..题目似乎没有要求说碰/顺子不能和pair重复数字 这应该是合法的吧
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-HTOOO  2020-8-1 16:57:39
相位疯脸 发表于 2020-7-31 15:05
最近跳槽感觉国人如果不是大牛的话,在美国只有两种情况面试过的概率较高。

1. 大厂常规面试,面试官里 ...

很有道理。现在的bar真的比较高。
回复

使用道具 举报

🔗
ycj28c 2020-8-2 07:23:58 | 只看该作者
全局:
本帖最后由 ycj28c 于 2020-8-2 08:04 编辑

麻将似乎是贪婪题,先统计一下各个数字出现的次数,存放到int[] arr中
然后先找到> 2的数字,从arr中减去,对剩下的数字从小到大进行贪婪,总是优先满足顺子,没顺子了就看是否满足碰子。
这样的复杂度应该是O(NK),因为已知道数字是1-9,所以就是O(N)复杂度
比如
11223344,先移除2个1,对剩余的数优先找顺子,就是234和234
再比如
12233333445,移除2个3,剩余的数就是123,234,345

[i][i][i][i][i][i][i][i][i][i][i][i][i]
  1. private boolean nengHu(int[] arr){
  2.         int[] majiang = new int[9];
  3.         if((arr.length - 2) % 3!= 0) return false;
  4.         for(int num : arr) majiang[num-1]++;
  5.         for(int i=0;i<9;i++){
  6.                 if(arr[i] >= 2){
  7.                         int[] cp = Arrays.copyOfRange(majiang, 0, majiang.length);
  8.                         cp[i] -=2;
  9.                         if(helper(cp)) return true;
  10.                 }
  11.         }
  12.         return false;
  13. }
  14. private boolean helper(int[] arr){
  15.         for(int i=0;i<arr.length;i++){
  16.                 while(arr[i] > 0){
  17.                         if(i <= 7 && arr[i] > 0 && arr[i+1] > 0 && arr[i+2] > 0){
  18.                                 arr[i]--;
  19.                                 arr[i+1]--;
  20.                                 arr[i+2]--;
  21.                         } else if(arr[i] >= 3){
  22.                                 arr[i]-=3;
  23.                         } else return false;
  24.                 }
  25.         }
  26.         return true;
  27. }
复制代码

[/i][/i][/i][/i][/i][/i]
[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]

补充内容 (2020-8-3 02:00):
emmm,好像不对,不能从小到大选顺子
11222334455好像过不了,还是要穷举
回复

使用道具 举报

全局:
ycj28c 发表于 2020-8-2 07:23
麻将似乎是贪婪题,先统计一下各个数字出现的次数,存放到int[] arr中
然后先找到> 2的数字,从arr中减去 ...

那如果input是个array of number 呢?也就是说,不是像麻将一样每次一定14张牌。
回复

使用道具 举报

全局:
麻将的题目,试着写了一个。欢迎讨论。

  1. def valid(count: dict):
  2.     if not count:
  3.         return True

  4.     min_key = min(count.keys())  # should be quick enough since there are maximum 9 different digits. can use OrderedDict to save some time
  5.     if count[min_key] >= 3:
  6.         backup = s[min_key]
  7.         count[min_key] -= 3
  8.         if count[min_key] == 0:
  9.             del count[min_key]
  10.         if valid(count):
  11.             return True
  12.         count[min_key] = backup

  13.     if min_key + 1 in count and min_key + 2 in count:
  14.         for k in [min_key, min_key + 1, min_key + 2]:
  15.             if count[k] == 1:
  16.                 del count[k]
  17.                 continue
  18.             count[k] -= 1

  19.         return valid(count)

  20.     return False


  21. def main(s: str):
  22.     if (len(s) - 2) % 3 != 0:
  23.         return False

  24.     from collections import Counter

  25.     s = [int(c) for c in s]

  26.     counter = Counter(s)
  27.     pairs = [k for k, v in counter.items() if v >= 2]

  28.     for pair in pairs:
  29.         backup = counter[pair]
  30.         counter[pair] -= 2
  31.         if counter[pair] == 0:
  32.             del counter[pair]
  33.         if valid(counter):
  34.             return True
  35.         counter[pair] = backup

  36.     return False
复制代码
回复

使用道具 举报

🔗
caramonmajere 2020-8-23 08:06:50 | 只看该作者
全局:
string 替换那个,嵌套的意思是这个吗?
例如%b -> bad
那么 %%%b ->%%bad -> %badad -> badadad ?
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-HTOOO  2020-8-28 07:50:36
不好意思,楼主很久没有看帖子了。

其实是需要两个%%,所以是要替换两个%之间的值。
user -> user
1. 当你遇到%user%,就会替换成user。
2. 当你遇到%%user%%,第一步替换成%user%,第二步替换成user。
回复

使用道具 举报

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

本版积分规则

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