牛客-找出最接近的对称数字

本文最后更新于:2022年6月20日 晚上

输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串

注1: 输入字符串的长度最多不会超过18

注2: 当大于输入数字和小于输入数字的对称数字与输入数字距离相同时,取小的数字作为答案

输入:

123

输出:

121

字符串常用函数:

  • reverse(s.begin(),s.end()); 翻转字符串s
  • replace(int pos, int len, string str); 用str字符串替换从 pos 起始位置起,长度为len的字符
  • substr(int index, int num); 返回从index位置起,长num个字符; 不加第二个参数num则返回从index开始的剩余的字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

// 判断是否是 1000 这种模式的 字符串
bool isValid(string s)
{
bool flag = true;
if (s[0] != '1') flag = false;

if (s[0] == '1')
{
for (unsigned int i = 1; i < s.size(); i++)
{
if (s[i] != '0')
{
flag = false;
break;
}
}
}
return flag;
}

int main()
{
// 33802918 6 96668661
// 33802918 6 81920833
// 只需要把前半段的复制到后半段
string s;
cin >> s;
if (s.size() <= 1)
{
cout << s;
return 0;
}

// 是1000 类型的
if (isValid(s))
{
string r = "";
while (r.size() < s.size()-1)
r += "9";
cout << r;
return 0;
}

// 不是1000类型的
string str = s;
reverse(s.begin(), s.end());
int n = s.size();
// cout << n << endl;

string substr = s.substr(n/2+1);
// cout << substr << endl;
str.replace(n/2+1, n, substr);

cout << str << endl;
return 0;
}

参考题解:

链接:https://www.nowcoder.com/questionTerminal/e605ba77112b425889bee3f40481fe93
来源:牛客网


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!