首页 > 试题广场 >

小红的双生数

[编程题]小红的双生数
  • 热度指数: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
简直太恶心了,没有技巧,全是头铁
package main

import "fmt"

func main() {
    var x string
    fmt.Scan(&x)
    array := []byte(x)
    var process func(int)
    process = func(i int) {
        for j := 1; i+2*j < len(array); j++ {
            if j%2 == 1 {
                array[i+2*j] = '0'
                array[i+2*j+1] = '0'
            } else {
                array[i+2*j] = '1'
                array[i+2*j+1] = '1'
            }
        }
    }
    var adjacentequalprocess func(int) bool
    adjacentequalprocess = func(i int) bool {
        var reval bool
        if i > 0 && array[i] == array[i-2] {
            if array[i] == '9' {
                for i > 0 && array[i] == '9' {
                    i = i - 2
                }
                if i == 0 && array[i] == '9' {
                    array = append(array, '1', '1')
                    array[0], array[1] = '1', '1'

                } else {
                    array[i]++
                    array[i+1]++
                    reval = adjacentequalprocess(i)
                }
            } else {
                array[i]++
                array[i+1]++
                reval = adjacentequalprocess(i)
            }
            if !reval {
                process(i)
                reval = true
            }
        }
        return reval
    }
    if len(array)%2 != 0 {
        array = append(array, '1')
        array[0], array[1] = '1', '1'
        process(0)
        fmt.Println(string(array))
        return
    }
    for i := 0; i < len(array); i += 2 {
        if array[i] == array[i+1] {
            if ok := adjacentequalprocess(i); ok == true {
                break
            }
        } else {
            if array[i] < array[i+1] {
                array[i]++
                array[i+1] = array[i]
            } else {
                array[i+1] = array[i]
            }
            if ok := adjacentequalprocess(i); ok == true {
                break
            }
            process(i)
            break
        }
    }
    fmt.Println(string(array))
}

发表于 2025-04-12 00:56:27 回复(0)