查看: 3089| 回复: 14
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 求助一个google的高频电面题目!

全局:
高频题
公司名称: google

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

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

x
求助一个google的高频电面题目,有点被自己绕晕了!求大侠指点
balanced String 只能有 0 和 1,不能有连续3个位置上数字相同的string.
1.给定长度n,一共有多少种balanced string
2.给定长度n, 生成所有给定长度的string

上一篇:搜索类型bfs, dfs, dp的一点感想
下一篇:刷题从easy题毫无思路到大多数medium都有点儿想法
全局:
如果用DFS的话,可能这样做吧?两个问题只是这个res的形式不一样

def balanced_string(n):
    res = []
   
    def dfs(pref):
        if len(pref) >= 3 and (pref[-3:] == '111' or pref[-3:] == '000'):
            return

        if len(pref) == n:
            res.append(pref)
            return

        for i in ['0', '1']:
            pref += i
            dfs(pref)
            pref = pref[:-1]

    dfs('')
    return res

回复

使用道具 举报

推荐
tianyug 2019-10-6 10:36:40 | 只看该作者
全局:
我也提供一个思路吧,就算数的

dp的话就是 dp[n] = 2*dp[n-1] - dp[n-3]

可能比较容易理解一点,就是把所有长度为n-1的符合条件的str后面加0或者加1,会得到2*dp[n-1]这么多的str,但是里面有一些是不符合条件的,就把它们减掉,这些不符合条件的str出现三个连续的0或1的地方只会在最后三位,一半是000,另一半是111,一共有dp[n-3]这么多个

算出来的结果和dp[n] = dp[n-1] + dp[n-2]是一样的

写成代码是
def dp(n):
    if n == 0:
        return 1
    elif n == 1:
        return 2
    elif n == 2:
        return 4
    elif n == 3:
        return 6
    else:
        return 2*dp(n-1) - dp(n-3)
回复

使用道具 举报

全局:
drift1981 发表于 2019-10-5 06:43
我自己照这个方法写了一下,终止条件需要再加一个 len(pref) > n,大牛一定是写忘记了,非常感谢!

实在不敢当。没想通,所以想问一下,为什么要加这个check呢?按理说,不会有>n的情况出现的吧。不过我确实忘记了一个特殊的输入情况,就是n = 0的时候,应该在程序最开始的时候check一下。
回复

使用道具 举报

🔗
pengpengcode 2019-10-5 06:17:16 | 只看该作者
全局:
dp 感觉是这样
n[i][1] = n[i - 1][0] + n[i - 1][1] - n[i - 2][1]
n[i][0] = n[i - 1][1] + n[i - 1][0] - n[i - 2][0]

return n[n][0] + n[n][1]
回复

使用道具 举报

🔗
SimonLevy 2019-10-5 06:20:43 | 只看该作者
全局:
提供个思路,用dp,dp**[i] 表示endwith**,长度为i的string的数量,例如dp00[i] 就是endwith 00,并且长度为i

dp00[i] = dp10[i - 1];
dp01[i] = dp00[i - 1] + dp10[i - 1];
dp10[i] = dp11[i - 1] + dp01[i - 1];
dp11[i] = dp01[i - 1];

评分

参与人数 1大米 +2 收起 理由
Vincent6 + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
 楼主| drift1981 2019-10-5 06:42:41 | 只看该作者
全局:
yiliaobailiao 发表于 2019-10-5 06:06
如果用DFS的话,可能这样做吧?两个问题只是这个res的形式不一样

def balanced_string(n):

非常感谢牛人的指导!

回复

使用道具 举报

🔗
 楼主| drift1981 2019-10-5 06:43:33 | 只看该作者
全局:
yiliaobailiao 发表于 2019-10-5 06:06
如果用DFS的话,可能这样做吧?两个问题只是这个res的形式不一样

def balanced_string(n):

我自己照这个方法写了一下,终止条件需要再加一个 len(pref) > n,大牛一定是写忘记了,非常感谢!
回复

使用道具 举报

🔗
 楼主| drift1981 2019-10-5 06:54:55 | 只看该作者
全局:
pengpengcode 发表于 2019-10-5 06:17
dp 感觉是这样
n[1] = n[0] + n[1] - n[1]
n[0] = n[1] + n[0] - n[0]

谢谢!我去实现一下。
回复

使用道具 举报

🔗
 楼主| drift1981 2019-10-5 06:55:25 | 只看该作者
全局:
SimonLevy 发表于 2019-10-5 06:20
提供个思路,用dp,dp** 表示endwith**,长度为i的string的数量,例如dp00 就是endwith 00,并且长度为i

...

谢谢提供思路!我去实现一下。
回复

使用道具 举报

🔗
vanpyz2019 2019-10-5 08:22:23 | 只看该作者
全局:
本帖最后由 vanpyz2019 于 2019-10-5 08:35 编辑

DP:
F[n] = F[n-1] + F[n-2]
F[1] = 2
F[2] = 4

Set F[n][0] is the number of strings with length n ending with 0, F[n][1] is ending with 1.
So: F[n][0] = F[n-1][1] + F[n-2][1], F[n][1] = F[n-1][0] + F[n-2][0]
as F[n] = F[n][0] + F[n][1]
F[n] = F[n-1] + F[n-2]


补充内容 (2019-10-6 00:55):
    def gen_zero_ones(self, n):
        result = []

        def dfs(k, tmp, result):
            if k == 0:
                result.append(tmp)
                return
            if len(tmp) >= 2 and tmp[-1] == tmp[-2]:
                t = "1" if tmp[-1] == "0" else "0"
                dfs(k - 1, tmp + t, result)
            else:
                dfs(k - 1, tmp + "0", result)
                dfs(k - 1, tmp + "1", result)

        dfs(n, "", result)
        return result
回复

使用道具 举报

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

本版积分规则

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