leetcode简单题_Day1


前言

  1. 题目前标号即为leetcode中对应的题号
  2. 此文是刷题后的个人总结

1.两数之和

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
		//此处填写解答
    }
};

思路

一开始想暴力结果超时

/*buggy code*/
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> tmp;
        int t=nums.size();
        for(int i=0;i<t-1;i++){
            for(int j=i+1;j<t;j++){
                if(nums[i]+nums[j]==target){
                    tmp.push_back(i);
                    tmp.push_back(j);
                    return tmp;
                }
            }
        }
        return tmp;
    }
};

看了大佬的题解, 可以用map节约时间, 而且建map和查找可以在一次遍历中完成, 更加节约时间

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> tmp;//存结果
        map<int,int> m;
        int t=nums.size();
        for(int i=0;i<t;++i){//建map和查找可以在一次遍历中完成, 先建map再找也可以pass
            if(m.count(target-nums[i])>0){
                tmp.push_back(m[target-nums[i]]);
                tmp.push_back(i);
            }
            m[nums[i]]=i;
        }
        return tmp;
    }
};

7.整数反转

题目

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

class Solution {
public:
    int reverse(int x) {
		//此处填写解答
    }
};

思路

  1. 要反转, 想到把它转成字符串再进行操作, string str = std::to_string(int x);
  2. 考虑到存在负号不方便直接反转, 所以把负号取出来, 取负号用的是str.erase(), 有三种用法

string& erase ( size_t pos = 0, size_t n = npos );
删除从pos开始的n个字符, 包括pos处

iterator erase ( iterator position );
删除position处的一个字符

iterator erase ( iterator first, iterator last );
删除[first, last)之间的字符

  1. 翻转字符串可以用 algorithm中的std::reverse(str1.begin(), str1.end() ), 或者cstring中的strrev(str2)
    注意: str1是string对象, str2是char* 即c风格的字符串, 二者不能混用
  2. 这里因为我用了string所以尝试了一下std::reverse, 发现还没我自写的翻转快, 所以就没用
    上面那个是用 std::reverse 的耗时, 下面是自写的
  3. 翻转之后就需要把字符串转为整数, 用stoi(), 这个函数在int溢出时会throw一个out_of_range的错误, 便于进行try catch处理; 如果用atoi(), 溢出就会返回上/下界而没有任何提示, 不方便处理
  4. 最后别忘了再乘上符号位
class Solution {
public:
    int reverse(int x) {
        string tmp=std::to_string(x);
        //保存符号位,删除符号位
        int sign=1;
        if(tmp[0]=='-'){
            sign=-1;
            tmp.erase(tmp.begin());
        }

        //翻转 时间复杂度O(n)
        int n=tmp.length();
        if(n>10){//超出10位直接返回, 节约时间, 避免翻转操作
            return 0;//-2,147,483,648 ~ 2,147,483,647 10位数
        }
        //自写翻转函数竟然比标准库函数快
        //std::reverse(tmp.begin(),tmp.end());
        for(int i=0,j=n-1;i<j;i++,j--){
            char c=tmp[i];
            tmp[i]=tmp[j];
            tmp[j]=c;
        }
        
        int ans=0;
        try{
            ans=stoi(tmp);
        }catch(out_of_range err){}
        return ans*sign;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值