首页 > 试题广场 >

小红的双生数

[编程题]小红的双生数
  • 热度指数:4606 时间限制: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
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)
x=input()
if len(x)%2==1:
    x=x.zfill(len(x)+1)
result=[]
length=len(x)//2
flag=-2
for i in range(length):
    a = int(x[2 * i:2 * i + 2])
    num = (a // 11 + 1) * 11 if a%11!=0 else -1
    if a % 11 == 0 and a!=flag:
        result.append(f"{a:02d}")
        flag=a
        continue
    elif a==flag&nbs***bsp;num==flag:
        result.append(str(a+11) if a==flag else str(num+11))
    else:
        result.append(str(num))
    for _ in range((length-i)//2):
        result.append('00')
        result.append('11')
    break
pos1=i
result=result[:length]
flag=0
pos=-1
for i in range(pos1,-1,-1):
    if flag==1:
        result[i]=str(int(result[i])+11)
        flag=0
    if  i-1>=0:
        if result[i] == result[i-1]:
            result[i]=str(int(result[i])+11)
    if len(result[i])>=3:
        result[i]='00'
        flag=1
        pos=i
if pos!=-1:
    result=result[:pos]
    for _ in range((length-pos+1) // 2):
        result.append('00')
        result.append('11')
if flag==1:
    result=['11','00']+result[1:]
    length+=1
result=result[:length]

print(''.join(result))

发表于 2025-12-20 17:38:50 回复(0)
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)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    int n = s.length();
    string rst = "";
    bool changed = false;
    if (n % 2) {
        for (int i = 0; i < n + 1; i += 2) {
            if (i % 4) {
                rst += "00";
            } else {
                rst += "11";
            }
        }
    } else {
        rst = s;
        for (int i = 0; i + 1 < n; i += 2) {
            if (changed) {
                rst[i] = rst[i + 1] = rst[i - 1] == '0'?'1':'0';
            } else {
                if (rst[i] != rst[i + 1]) {
                    char c = rst[i] > rst[i + 1] ? rst[i] : rst[i] + 1;
                    rst[i] = rst[i + 1] = c;
                    changed = true;
                }
                if (i >= 2 && rst[i] == rst[i - 2]) {
                    if (rst[i] == '9'){
                        if(i>=4){
                            rst[i-3]+=1;
                            i-=6;
                            changed=false;
                        }else{
                            rst="110011"+rst.substr(4,n);
                            n=rst.length();
                            changed = true;
                            i=4;
                        }
                    }else{
                        rst[i] = rst[i + 1] = rst[i]+1;
                        changed = true;
                    }
                }
            }

        }
    }
    cout << rst;
}
// 64 位输出请用 printf("%lld")

发表于 2025-10-28 19:36:14 回复(0)
#include <iostream>
#include <vector>
using namespace std;

vector<int> fill(int num, bool flag){
    num /= 2;
    vector<int> ret;
    while(num-- > 0){
        if(flag){
            ret.emplace_back(1);
            ret.emplace_back(1);
        }
        else{
            ret.emplace_back(0);
            ret.emplace_back(0);
        }
        flag = !flag;
    }
    return ret;
}

int main() {
    string str;
    cin >> str;
    
    int count = str.size();
    vector<int> bit;
    for(char c : str){
        bit.emplace_back(c - '0');
    }

    vector<int> output;
    if(count % 2 == 1){
        output = fill(count + 1, true);
    }else{
        // for(int x : bit) cout << x; cout << endl;
        int idx = 0;
        while(idx < count){
            if(bit[idx] == bit[idx + 1]){
                output.emplace_back(bit[idx]);
                output.emplace_back(bit[idx]);
                idx += 2;
            }else{
                int target = bit[idx] * 10 + bit[idx + 1];
                for(int i = 0; i < 10; ++i){
                    if(i * 11 >= target){
                        output.emplace_back(i);
                        output.emplace_back(i);
                        break;
                    }
                }
                auto fillVec = fill(count - idx - 2, false);
                output.insert(output.end(), fillVec.begin(), fillVec.end());
                break;
            }
        }
        // for(int x : output) cout << x; cout << endl;

        for(int i = 2; i < count; i += 2){
            if(output[i] == output[i - 1]){
                // 至少有4个连续的数字存在
                bool found = false;
                for(int j = i + 1; j >= 0; j -= 2){
                    ++output[j], ++output[j - 1];   // 调整当前4个数的低2位,尝试符合题意
                    if(j > 2 && output[j] == output[j - 2]){
                        // 后面的调整可能导致前面连锁调整,因此再次+1
                        ++output[j], ++output[j - 1];
                    }

                    if(output[j] >= 10) continue;   // 需要高位+1,这些低位被重置
                    found = true;
                    int k = 0;
                    // 重置低位
                    for(int p = j + 2; p < count; p += 2){
                        output[p] = output[p - 1] = k;
                        k = (k + 1) % 2;
                    }
                    break;
                }

                if(!found){
                    // 无论如何无法在count位内构造,增加位数
                    // for(int x : output) cout << x; cout << endl;
                    output = fill(count + 2, true);
                    break;
                }
            }
        }
    }

    for(int x : output) cout << x; cout << endl;

    return 0;
}

参照其他评论的思路写的,加了一些注释
发表于 2025-07-04 17:13:03 回复(0)
limit = input()

if len(limit)%2!=0:
    s = '11'
    s0 = ''.join('0' for i in range(len(limit)-1))
    print(s+s0)
else:
    head = ''
    for i in range(0,len(limit),2):
        fir = limit[i]
        sec = limit[i+1]
        if fir==sec:
            head = limit[i:i+2]
        elif fir >sec:
            head = head + fir + fir
            last = ''.join('0' for i in range(len(limit)-i-2))
            print(head+last)
            break
        elif sec > fir:
            head = head + sec + sec
            last = ''.join('0' for i in range(len(limit)-i-2))
            print(head+last)
            break
发表于 2025-04-20 12:24:46 回复(0)
#include <iostream>
using namespace std;

int main() {
string s;cin>>s;
string result;
if(s.size()&1)//奇数个字符
{
int temp=0;
for(int i=0;i<s.size()+1;i++)
{
if(!temp)
{
result+="11";
temp=1;
}else {
result+="00";
temp=0;
}
i++;
}
}else {
bool havechanged=false;char p='0';
for(int i=0;i<s.size();i++)
{
if(havechanged)
{
result.push_back(p);
result.push_back(p);
if(p=='0')p='1';
else p='0';
}else {
if(s[i]!=s[i+1])
{
char max;
if(s[i]>s[i+1])max=s[i];
else max=s[i]+1;
result.push_back(max);
result.push_back(max);
havechanged=true;p='0';
}else {
result.push_back(s[i]);
result.push_back(s[i]);
}
}
i++;
}// 先初步拿到result

//

//result 去重
int point;
for(int i=result.size()-2;i>0;i-=2)
{
if(result[i]==result[i-2])
{
if(result[i]!='9')
{
result[i]=result[i]+1;
result[i+1]=result[i];
char p='0';
for(int j=i+2;j<result.size();j+=2)
{
result[j]=p;
result[j+1]=p;
if(p=='0')p='1';
else p='0';
}
}else {
int mm=1;
while(i-2*mm>=0)
{
if(result[i-2*mm]!='9')
{
result[i-2*mm]+=1;
result[i-2*mm+1]=result[i-2*mm];
char p='0';point=i-2*mm;
for(int j=i-2*mm+2;j<result.size();j+=2)
{
result[j]=p;
result[j+1]=p;
if(p=='0')p='1';
else p='0';
}
break;
}
mm++;
}
}
}
}
//result 中含多个9的特殊情况
if(result.find("999")!=string::npos)
{
int len=result.size();
result.clear();
char p='1';
for(int j=0;j<len+2;j+=2)
{
result.push_back(p);
result.push_back(p);
if(p=='0')p='1';
else p='0';
}
}
}
cout<<result;
}
// 64 位输出请用 printf("%lld")
发表于 2025-04-18 17:48:55 回复(0)
简直太恶心了,没有技巧,全是头铁
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)
package main

import (
	"fmt"
	"strconv"
)

func find(s string) []int {
	n := len(s)
	var ans []int

	if n%2 == 1 { // 奇数长度
		ans = make([]int, n+1)
		for i := 1; i <= n; i += 2 {
			val := ((i / 2) & 1) ^ 1
			ans[i] = val
			ans[i-1] = val
		}
	} else { // 偶数长度
		ans = make([]int, n)
		for i := 1; i < n; i += 2 {
			a, _ := strconv.Atoi(string(s[i-1]))
			b, _ := strconv.Atoi(string(s[i]))
			if a == b {
				ans[i] = a
				ans[i-1] = a
			} else {
				target := a*10 + b
				for j := 0; j < 10; j++ {
					if j*11 >= target {
						ans[i] = j
						ans[i-1] = j
						break
					}
				}
				k := 0
				for j := i + 2; j < n; j += 2 {
					ans[j] = k
					ans[j-1] = k
					k ^= 1
				}
				break
			}
		}

		for i := 2; i < n; i += 2 {
			if ans[i] == ans[i-1] {
				found := false
				for j := i + 1; j >= 0; j -= 2 {
					ans[j] += 1
					ans[j-1] += 1
					if j > 2 && ans[j] == ans[j-2] {
						ans[j] += 1
						ans[j-1] += 1
					}
					if ans[j] < 10 {
						found = true
						k := 0
						for p := j + 2; p < n; p += 2 {
							ans[p] = k
							ans[p-1] = k
							k ^= 1
						}
						break
					}
				}
				if !found {
					ans = make([]int, n+2)
					for j := 1; j <= n+1; j += 2 {
						val := ((j / 2) & 1) ^ 1
						ans[j] = val
						ans[j-1] = val
					}
					return ans
				}
			}
		}
	}
	return ans
}

func main() {
	var x string
	fmt.Scan(&x)
	result := find(x)
	for _, num := range result {
		fmt.Print(num)
	}
	fmt.Println()
}

发表于 2025-04-07 08:05:59 回复(0)
恶心
发表于 2025-04-03 17:06:58 回复(1)
#简洁明了
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)