首页 > 试题广场 >

小红的双生数

[编程题]小红的双生数
  • 热度指数:4588 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}小红定义一个正整数是“双生数”,当且仅当该正整数的每个数位的相邻数位中,恰好有一个和该数位的数字相同。
\hspace{15pt}现在小红拿到了一个正整数 x,她希望你求出不小于 x 的最小“双生数”。

输入描述:
\hspace{15pt}输入一个正整数 x \left(1 \leqq x \leqq 10^{100\,000}\right) 代表限制。


输出描述:
\hspace{15pt}输出一个正整数,代表不小于 x 的最小“双生数”。该数字不包含前导零。
示例1

输入

123

输出

1100

说明

\hspace{15pt}在这个样例中,1100 的第一、二个数位相同,第三、四个数位相同。我们可以证明,这是符合要求的最小的双生数。
示例2

输入

114514

输出

115500
def main():
    n = input()
    result = ""
    if len(n) % 2 != 0:
        result = "11" + get_letter(len(n) - 1)
    else:
        temp_data = ''
        for i in range(0, len(n), 2):
            if n[i] == n[i + 1]:
                if temp_data != n[i]:
                    result += n[i] + n[i]
                    temp_data = n[i]
                else:
                    result = get_while(n[:i + 2]) + get_letter(len(n) - i - 2)
                    break
            else:
                result = get_while(n[:i + 2]) + get_letter(len(n) - i - 2)
                break

    print(result)

def get_while(result) -> str:
    temp_data = 0
    result_len = len(result)
    while True:
        min_data = min(int(result[-1]), int(result[-2]))
        if len(result) == 2:
            return "11" + get_letter(result_len) if min_data == 9 else str(int(min_data) + 1) + str(
                int(min_data) + 1) + get_letter(result_len - 2)
        if min_data == 9:
            result = result[:-2]
            temp_data += 2
            continue
        if str(min_data + 1) != result[-3]:
            return result[:- 2] + str(min_data + 1) + str(min_data + 1) + get_letter(temp_data)
        if min_data == 8:
            result = result[:-2]
            temp_data += 2
            continue

        return result[:- 2] + str(min_data + 2) + str(min_data + 2) + get_letter(temp_data)

def get_letter(data_len: int) -> str:
    if not data_len:
        return ""
    result = ''
    start_data = 0
    for i in range(data_len // 2):
        result += str(start_data) + str(start_data)
        start_data ^= 1

    return result

if __name__ == "__main__":
    main()

发表于 2025-11-13 17:10:15 回复(0)
num = [int(n) for n in input().strip()]
num = ([0, 0, 0] if len(num) % 2 else [0, 0]) + num

altered = False
i = 0
while i < len(num):
    if altered:
        # 之前变过了没问题,那剩下必然是交替01序列
        num[i] = num[i + 1] = 1 if num[i - 1] == 0 else 0
    else:
        if num[i] != num[i + 1]:
            num[i] = num[i + 1] = num[i] if num[i] > num[i + 1] else num[i] + 1
            altered = True

        if i > 1 and num[i] == num[i - 1]:
            if num[i] == 9:  # 连续9999
                num[i - 3] += 1
                i -= 6  # 退回到4位前的二元组重新处理,因为while循环最后还有i += 2这里补偿一下
                altered = False
            else:
                num[i] = num[i + 1] = num[i] + 1
                altered = True
    i += 2

# 删除赘余0
for j in range(len(num)):
    if num[j] != 0:
        print("".join([str(n) for n in num[j:]]))
        break


发表于 2025-04-29 16:54:08 回复(0)
#简洁明了
def _solve(ss):
    """处理问题逻辑"""
    s = list(ss)
    n = len(s)
    q,r = divmod(n,2)
    #需要判断奇数还是偶数
    #1.奇数位不可能是双生数,要变成11,1100,110011的情况
    if r:
        return "".join(  [ "00" if i%2 else "11" for i in range(q+1) ])
    #2.偶数位的处理
    else:
        i=0
        flag=False
        while i<n:
            if s[i]!=s[i+1]:
                if s[i]>s[i+1]:
                    s[i+1]=s[i]
                else:
                    s[i]=s[i+1]=f"{int(s[i])+1}"
                if i<2 or s[i]!=s[i-1]:
                    break
            if i>1 and s[i]==s[i-1]:                    
                t = int(s[i])
                if t<9:
                    s[i]=s[i+1]=str(t+1)
                else:
                    flag = True #998899889999
                    while(i>=0 and s[i]=='9' or i>0 and s[i]>'7' and s[i-1]>'8'):
                        i-=2
                break
            i+=2
        s[i+2:] =   [ "11" if i%2 else "00" for i in range(n-i-2>>1) ]
        if flag:
            ti = int(s[i])
            if i<0:
                s=["11"]+s
            elif i>0:
               
                tmp = set('123456789')-set(map(str,range(ti)))-set(s[i-1])-set(s[i])
                s[i]=s[i+1] = min(tmp)
            else:
                s[i]=s[i+1] = str(ti+1)  
        return "".join(s)
def solve(s):
    """调用处理逻辑func,输出返回结果"""
    res = _solve(s)
    print(res)

# INPUTS="1233"
INPUTS=input()
solve(INPUTS)
发表于 2025-03-07 18:16:56 回复(1)