文章目录
前言
<来自力扣的三道简单算法题解法分享>
题目一:判断一个整数是否是回文数;
题目二:把输入的罗马数字转换成整数;
题目三:把输入的整数反转后输出。
下面案例仅供参考
一、整数的回文数判断
输入一个整数,判断是否为回文数,是则返回true,否则返回false。 例:输入【-121】,返回false;输入【12321】,返回true。1、负数和一位数的判断
if (x < 0)return false; //小于0的都不是回文数
if (x >= 0 && x <= 9)return true; //0~9是回文数
2、将整数存进vector容器
vector<int>a;
int n = 0;
while (x != 0) { //整除法存进容器a (头插)
a.insert(a.begin(), x % 10);
x /= 10;
n++;
}
3、下标mid和next的定位(关键)
int mid = n / 2 - 1; /*定位mid*/
int Next = 0;
if (n % 2 == 0)
Next = mid + 1; /*定位偶数的next*/
else
Next = mid + 2; /*定位奇数的next*/
4、循环比较并得出结果
int i = 0, j = 0;
for (i = mid, j = Next; i >= 0 && j <= a.size(); i--, j++) {
if (a[i] == a[j])continue;
else return false;
}
return true;
二、罗马数字转整数
1、简介罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 I (1)、V(5)、X(10)、L (50)、C(100)、D (500)、M(1000) 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
2、利用for嵌套switch case语句实现转换:
for (int i = 0; i < s.size(); i++) {
switch (s[i]) {
case 'I': {
if (s[i + 1] == 'V') { ans += 4; i++; break; }
if (s[i + 1] == 'X') { ans += 9; i++; break; }
ans += 1;
}break;
case 'V':ans += 5; break;
case 'X': {
if (s[i + 1] == 'L') { ans += 40; i++; break; }
if (s[i + 1] == 'C') { ans += 90; i++; break; }
ans += 10;
}break;
case 'L':ans += 50; break;
case 'C': {
if (s[i + 1] == 'D') { ans += 400; i++; break; }
if (s[i + 1] == 'M') { ans += 900; i++; break; }
ans += 100;
}break;
case 'D':ans += 500; break;
case 'M':ans += 1000; break;
}
}
三、整数反转
输入一个int类型范围的整数,输出反转后的整数
例:
输入【-123】输出【-321】
输入【857】 输出【758】
1、接值,并检查是否为负数
特殊情况:
当输入值为-2147483648时,直接用x=-x会超出int类型的范围
(int类型取值范围:-2147483648 至 2147483647)
long long y;
int tap = 0;
if (x < 0) { /*检查是否为负数*//*是则将其变为正数并标记*/
y = x; /*考虑到当x取-2147483648时,不能用x=-x*/
y = -y;
tap = 1;
}
else y = x;
2、检查位数(将count乘到与x的一致位数)
int temp = y;
long long count = 1;
while (temp != 0) { /*整除法检查x的位数*/
temp /= 10;
count *= 10; /*count乘到比x位数多一位*/
}
count /= 10; /*count减少一位,与x位数一致*/
3、利用count进行位数转换
long long ans = 0;
while (y != 0) { //利用count进行位数转换
ans += ((y % 10) * count);
y /= 10;
count /= 10;
}
4、处理两种特殊情况
if (ans < -2147483648 || ans>2147483647)return 0;
/*如果超出int的范围则返回0*/
if (tap == 1) ans = -ans;
/*如果标记为1则将结果置为负数*/
总结
提示:这里对文章进行总结:
以上就是今天分享的三个内容,会有更优的解法,继续加油!