2023-07-31:用r、e、d三種字符,拼出一個回文子串數量等于x的字符串。
1 <= x <= 10^5。
來自百度。
答案2023-07-31:
大體步驟如下:
1.初始化一個字符串`builder`,用于構建結果字符串。
2.初始化一個字符變量`cur`,初始值為'r',用于輪流使用字符'r'、'e'和'd'構建回文串。
3.進入循環,直到輸入的整數x變為0。
4.在循環中,使用`near`函數找到最接近x且滿足條件的數值number。
- `near`函數采用二分法搜索,從1開始逐漸增加m的值,直到找到滿足條件的m值。
- 滿足條件是通過`ok`函數判斷,即判斷n乘以n+1再除以2是否小于等于x。
- 將滿足條件的m值賦給ans,并繼續搜索更大的m值。
5.對于當前找到的number,使用循環將字符cur添加到字符串builder中,重復number次。
6.計算處理完當前的number后,需要減去的值,即number乘以(number+1)再除以2,記為delta。
7.將delta從x中減去。
8.根據當前的cur字符,順序更新cur為下一個字符。
- 如果cur是'r',則更新為'e'。
- 如果cur是'e',則更新為'd'。
- 如果cur是'd',則更新為'r'。注意,這是一個循環的過程。
9.返回構建好的字符串builder。
總時間復雜度為O(x * log(x)),總空間復雜度為O(1),其中x是輸入的值。
# go完整代碼如下:
```go
package main
import (
"fmt"
)
func palindromeX(x int) string {
builder := ""
cur := 'r'
for x > 0 {
number := near(x)
for i := 0; i < number; i++ {
builder += string(cur)
}
x -= number * (number + 1) / 2
if cur == 'r' {
cur = 'e'
} else if cur == 'e' {
cur = 'd'
} else {
cur = 'r'
}
}
return builder
}
func near(x int) int {
l := 1
r := x
m, ans := 0, 0
for l <= r {
m = (l + r) / 2
if ok(m, x) {
ans = m
l = m + 1
} else {
r = m - 1
}
}
return ans
}
func ok(n, x int) bool {
return int64(n*(n+1)/2) <= int64(x)
}
func main() {
x := 13
fmt.Println(palindromeX(x))
}
```

# rust完整代碼如下:
```rust
fn palindrome_x(x: i32) -> String {
let mut builder = String::new();
let mut cur = 'r';
let mut x = x;
while x > 0 {
let number = near(x);
for _ in 0..number {
builder.push(cur);
}
x -= number * (number + 1) / 2;
cur = match cur {
'r' => 'e',
'e' => 'd',
_ => 'r',
};
}
builder
}
fn near(x: i32) -> i32 {
let mut l = 1;
let mut r = x;
let mut ans = 0;
while l <= r {
let m = (l + r) / 2;
if ok(m, x) {
ans = m;
l = m + 1;
} else {
r = m - 1;
}
}
ans
}
fn ok(n: i32, x: i32) -> bool {
(n * (n + 1) / 2) <= x
}
fn main() {
let x = 13;
println!("{}", palindrome_x(x));
}
```

# c++完整代碼如下:
```cpp
#include <iostream>
#include <string>
int near(int x);
std::string palindromeX(int x) {
std::string result;
char cur = 'r';
while (x > 0) {
int number = near(x);
for (int i = 0; i < number; i++) {
result += cur;
}
x -= number * (number + 1) / 2;
cur = (cur == 'r') ? 'e' : (cur == 'e') ? 'd' : 'r';
}
return result;
}
bool ok(int n, int x);
int near(int x) {
int l = 1;
int r = x;
int m, ans = 0;
while (l <= r) {
m = (l + r) / 2;
if (ok(m, x)) {
ans = m;
l = m + 1;
}
else {
r = m - 1;
}
}
return ans;
}
bool ok(int n, int x) {
return ((long long)n * (n + 1) / 2) <= x;
}
int main() {
int x = 13;
std::cout << palindromeX(x) << std::endl;
return 0;
}
```
