首页 > 试题广场 >

推倒吧骨牌

[编程题]推倒吧骨牌
  • 热度指数:4621 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

输入描述:
输入为一个长度不超过1000的,仅包含‘L’,‘R’,‘.’的字符串


输出描述:
根据输入,输出一个仅由‘L’,‘R’,‘.’组成的结果字符串
示例1

输入

.L.R...LR....L.

输出

LL.RR.LLRRRLLL.
def func(input_str):
    n = len(input_str)
    start = 0
    flag = 0
    for i in range(n):
        if input_str[i] == "L":
            if flag == 0:
                for j in range(start, i+1):
                    input_str[j] = "L"
            if flag == 1:
                mid = (i - start + 1) // 2
                for j in range(start, start+mid):
                    input_str[j] = "R"
                for j in range(i-mid+1, i+1):
                    input_str[j] = "L"
            start = i+1
            flag = 0
        if input_str[i] == "R":
            if flag == 0:
                flag = 1
                start = i
            if flag == 1:
                for j in range(start, i):
                    input_str[j] = "R"
                start = i
    if flag == 1:
        for j in range(start, n):
            input_str[j] = "R"
    for i in range(n):
        print(input_str[i], end="")
    print()

input_str = list(input())
func(input_str)

发表于 2019-08-27 00:07:32 回复(0)
"""
LR匹配问题,记录之前方向,分4类讨论LL/RL/RR/LR
"""
import math

if __name__ == "__main__":
    s = list(input().strip())
    ans = s[:]
    t = pl = pr = 0
    flag = '0'
    while t < len(s):
        while t < len(s) and s[t] == '.': t += 1
        if t >= len(s): break
        if s[t] == 'L':
            if flag == '0' or flag == 'L':
                for i in range(pl, t):
                    ans[i] = 'L'
            else:
                pl = t
                for i in range(pr, math.ceil((pr + pl) / 2)):
                    ans[i] = 'R'
                for i in range(math.floor((pr + pl) / 2) + 1, pl):
                    ans[i] = 'L'
            flag = 'L'
        elif s[t] == 'R':
            if flag == 'R':
                for i in range(pr + 1, t):
                    ans[i] = 'R'
            pr = t
            flag = 'R'
        t += 1
    if pr > pl:
        for i in range(pr, len(s)):
            ans[i] = 'R'
    print(''.join(ans))

编辑于 2019-07-11 10:08:30 回复(0)
s = input()
stat = [(i, char) for i, char in enumerate(s) if char != '.']
stat = [(-1, 'L')] + stat + [(len(s), 'R')]
#print()
#print(s)
for (i,ci), (j, cj) in zip(stat[:-1], stat[1:]):
    #print(i, j, ci, cj)
    if ci == cj:
        if i < 0:
            s = ci * (j-i) + s[j+1:]
        elif j == len(s):
            s = s[:i] + ci * (j-i) + s[j+1:]
        else:   
            s = s[:i] + ci * (j-i+1) + s[j+1:]
        #print(s)
    elif ci > cj: # R > L
        half = (j-i+1) // 2
        rest = (j-i+1) % 2
        s = s[:i] + 'R'*half + '.'*rest + 'L'*half + s[j+1:]
        #print(i, j, s)
        #print(s, i, j, s[:i], s[j+1:])
#print('LL.RR.LLRRRLLL.')
print(s)

参考LEETCODE838 https://leetcode.com/articles/push-dominoes/
发表于 2019-02-28 13:45:54 回复(1)