今天一共刷了三道Easy题,虽然是Easy,但是对刷题新手,也是有挑战的。
1.第七题:整数反转
题目不难,就是把一个整数反转过来,比如输入123,输出321,输入486,输出684,输入100,输出1。
整体思路的话,就是想要反转的话,要先获取后面的数,所以先取输入整数的个位数,即%10,将其加在另一个初值为0的变量上(最后return的变量),然后输入整数要/10,以便取下一位(个位数的下一位是十位数),下次的时候要先将以前取得的数乘10以提升他们的数量级,然后再加新取得的数,例如123,第一次取3,加到return的变量(暂且设为sum)上,此时sum=3,然后123/10 = 12;下一次,取2,然后之前取得的数(sum)要10,再加上新取的数,即310+2=32,然后12/10 = 1;下一次同样步骤取得1,最后sum为321。1/10=0,结束循环,即x>0时进行循环。
写成C++代码:
class Solution {
public:
int reverse(int x) {
long y = 0;
while(x){
y = y*10 + x%10;
x /= 10;
}
return (int)y == y? (int)y : 0;
}
};
注:题目有要求,假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。所以过大的数值先用long保存,最后转化为int再判断是否超出,return一个三元表达式。
2.第九题:回文数
做完了第七题,接着做第十题,完全可以用第七题的方法,将数值反转以后然后和原数值比较;而且,负值不可能是回文数,因此进行一个if判断。下面是用C++写的:
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0){
return false;
}
else{
long y = 0;
long a = x;
while(x)
{
y = y*10 + x%10;
x /= 10;
}
return y == a?true:false;
}
}
};
当然,这道题的进阶提示为:可否转化为字符串形式再进行操作?这样的话可以用javascript的方法写也比较简单,但是效率特别低,也可能是我太菜:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
var y = x.toString();
y = y.split('').reverse().join('');
return y==x?true:false;
};
//JavaScript经典反转字符串
3.第十三题:罗马数字转整数
这个题的核心问题是,罗马数字存在两种情况,第一,大的在前小的在后,这样表现为相加;第二,大的在后小的在前,这样表现为相减。要解决这个问题,一定要在取得一位的同时,将其与下一位相比较。
使用Js写法简练,但是效率偏低:
/**
* @param {string} s
* @return {number}
*/
let obj = {
I:1,
V:5,
X:10,
L:50,
C:100,
D:500,
M:1000
} //将每一个罗马数字字符代表的阿拉伯数字以键值对的形式保存在对象中
var romanToInt = function(s) {
let arr = s.split(''), sum=0; //将罗马字符的字符串分割为数组形式
for (let i = 0;i<arr.length;++i){
let num1 = obj[arr[i]];
let num2 = obj[arr[i+1]]; //取得num1后将其与num2对比
if (num1 < num2){
sum += (num2-num1); //如果出现了后者大于前者,即加上(大-小),而且i要再+1(因为相当于一次性计算了两个字符)
++i;
}
else{
sum += num1; //如果正常的前者大于后者,则可以直接加上当前字符
}
}
return sum;
};
总结:虽然是简单题,但是也有的题思路不好想,自己也借鉴了许多别人的代码。作为一名入门者,还是要多加练习顺便多加记忆,多看别人的代码思路,学会站在巨人的肩膀上,并且不断找到更简洁且运行时间更短的代码。