【LeetCode】—— 简单的OJ题

一、LeetCode7题 整数反转

1.1 题目描述

给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例1:

输入: 123
输出: 321

示例2:

输入: -123
输出: -321

示例3:

输入: 120
输出: 21

1.2 解题思路
  • 其实思路很简单,主要理解一下这句代码 ret = ret * 10 + a;举个例子来说明一下,当x = 123时,我们先取到该数的个位,这里只需要模10求余即可,再让x/10之后取得123的十位以此类推。
  • 该题还需注意的点是,必须注意反转后数字 INT_MIN < ret < INT_MAX,INT_MAX就是整型能表示的最大值,INT_MIN是整型能表示的最小值。
  • ret必须定义为long类型,不然会代码会出现执行错误,我们将ret定为long类型,在返回时将ret强制类型转换为int型返回即可。
    整数反转
1.3 代码实现
class Solution {
public:
    int reverse(int x) {
       int a = 0;
        long ret = 0;
        while(x != 0)
        {
            a = x % 10;
            x = x / 10;
            ret = ret * 10 + a;
            
            if(ret < INT_MIN || ret > INT_MAX)
                return 0;
        }
        
        return (int)ret;   
    }
};

二、LeetCode9题 回文数

2.1 题目描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

2.2 解题思路

验证回文数的方法有很多,这里提供三种供大家参考

方法一:

  • 借用上述反转整数的函数,将整数反转之后与原来整数比较,要是相同返回true,不同返回false,这里只需要注意处理一下负数的情况,由于负数带一个负号,所以反转之后肯定不会是回文数,我们单独除了负数,只要该数小于零返回false即可。

方法二:

  • 第二种方法其实也很好理解,C++实现,击败99.58%用户,思路很简单,这里用到了一个函数就是将数字转换为字符串的函数to_string,在转换字符串之前处理两个特殊的情况,即小于零和等于零的情况,转换之后用一个for循环用两个下标,一个从头一个从尾访问字符串,比较两个字符,能走出循环,说明该数是回文数。
    to_string
    方法三
  • 这个方法就比较简单了,将整数转换为字符串之后,逆转字符串,再与原字符串对比,相等返回true,不等返回false即可。
2.3 代码实现

方法一:

class Solution {
public:
    int reverse(int x) {
		int a = 0;
		long ret = 0;
		while (x != 0)
		{
			a = x % 10;
			x = x / 10;
			ret = ret * 10 + a;

			if (ret < INT_MIN || ret > INT_MAX)
				return 0;
		}

		return (int)ret;
	}
    bool isPalindrome(int x) {
        if(x < 0)
            return false;
        int ret = reverse(x);
        
        if(ret == x)
            return true;
        else
            return false; 
    }
};

方法二:

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0)
            return false;
        if(x == 0)
            return true;
        string str = to_string(x);
        for(size_t i = 0;i < str.size() - 1;++i)
        {
            if(str[i] != str[str.size()-i-1])
                return false;
        }
        return true;
    }
};

方法三

class Solution {
public:
    bool isPalindrome(int x) {
        if(x < 0)
            return false;
        string str = to_string(x);
        
        string rstr = str;
        reverse(rstr.begin(),rstr.end());
        
        return rstr == str;
    }
};

三、LeetCode13题 罗马数字转整数

3.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。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: “III”
输出: 3

示例 2:

输入: “IV”
输出: 4

示例 3:

输入: “IX”
输出: 9

示例 4:

输入: “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

3.2 解题思路
  • 虽然代码看起来挺多的,但是思路很简单,因为我们只有7个罗马数字不多,这里用到了switch-case语句,这里只要将罗马数字转换为对应的十进制数字,然后相加即可
  • 还是得处理特殊情况 ,若是后一个字符代表的数字是大于前一个的,就用后一个字符的值减去前一个的值 //eg:IV,4就是等于 v(5) - I(1) = 4;
3.3 代码实现
class Solution {
public:
    int romanToInt(string s) {
        int sum[50]={0},num=0;
        for(int i=0;i<s.length();i++)
        {
            switch(s[i])
            {
                case 'I':sum[i]=1;break;
                case 'V':sum[i]=5;break;
                case 'X':sum[i]=10;break;
                case 'L':sum[i]=50;break;
                case 'C':sum[i]=100;break;
                case 'D':sum[i]=500;break;
                case 'M':sum[i]=1000;break;
            }
            //若是后一个字符代表的数字是大于前一个的,就用后一个字符的值减去前一个得值
            //eg:IV,4就是等于 v(5) - I(1) = 4;
            if(i > 0&&sum[i] > sum[i-1]) 
                sum[i-1] =- sum[i-1];
        }
        //将所有字符代表的数字分别相加得到最后的数
        for(int i = 0;i < s.length();i++) 
            num = num + sum[i];
        return num;
        
    }
};

四、LeetCode66题 加一

4.1 题目描述

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

4.2 解题思路

主要可以分为三个if语句分支来处理这个题目:

  • 第一个if分支处理就是比较普遍的情况,数组最后一位若是小于9,此时只需要给最后一位加上一,返回该数组即可
  • 第二个if分支处理的情况就是当数组走到最前端位置时,,若是数组中的每个数位都是9,比如:[9,9,9,9,9],这是比较特殊的一种情况,此时循环处理每一位时,在没有到达最开始位,都可以将该位置0,最后在数组最前面的位置上插入一个1,此时数组为[1,0,0,0,0,0]。
  • 第三个if分支处理的情况就是当数组未走到最前端,但此时该位上又是9的情况,只需要将该位置0,即可。
  • 这3个if分支放在一个循环内,因为要处理的是每个数位上的情况。
4.3 代码实现
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for(int i = digits.size() - 1;i >= 0;--i)
        {
            if(digits[i] < 9)
            {
                digits[i] += 1;
                break;//若是最后一位数不大于9,就不用考虑进位的情况
            }
            else if(i == 0 && digits[i] == 9)
            {
                digits[i] = 0;
                digits.insert(digits.begin(),1);
            }
            else if(digits[i] == 9)
            {
                digits[i] = 0;
            }
        }
        return digits;
    }
};
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值