同樣是求「大於 N 的最小不重複數」,本文採用**字符串模擬進位**思路:將數字轉為字符串,從低位向高位掃描相鄰重複,發現則進位並將低位填入 `0101...` 最小模式。代碼直觀、易理解、易移植至大整數庫。
void str_reverse(unsigned char *s, unsigned len) {
for (unsigned char *l=s, *r=s+len-1; l= s; cur--) {
if (prv && *cur == *prv) {
// 進位
int carry = 1;
for (unsigned char *p = cur; carry && p < s + len; p++) {
*p += carry;
carry = (*p - '0') / 10;
*p = (*p - '0') % 10 + '0';
}
if (carry) { s[len++] = '0' + carry; }
// 低位填 0101...
int alt = 0;
for (unsigned char *p = cur; p >= s; p--) {
*p = '0' + alt;
alt ^= 1;
}
}
prv = cur;
}
str_reverse(s, len);
unsigned res; sscanf((char*)s, "%u", &res);
return res;
}
輸入: 1101 → 輸出: 1201 輸入: 1999 → 輸出: 2010 輸入: 989 → 輸出: 989 (本身不重複,但要求大於,故 1010)
| 維度 | 字符串法 (本文) | 數字陣列法 (前文) |
|---|---|---|
| 直觀度 | 高 (直接操作可見字符) | 中 (抽象數字陣列) |
| 大整數擴展 | 極易 (改用字符串大整數庫) | 需重寫進位邏輯 |
| 效能 | 略低 (字符串轉換開銷) | 高 (純整數運算) |
| 代碼長度 | 較短 | 中等 |
字符串法以「進位 + 低位填最小模式」為核心,邏輯清晰,適合快速原型、教學演示、大整數場景。若追求極致效能 (如競賽)、固定位寬整數,前文的數字陣列法更優。兩者同屬「貪心構造」範疇,掌握任一即可觸類旁通。