保持手速_N日N题0

为什么是n日n题而不是每日一题?hahhahah,博主要开始考研复习了,这段时间在代码上投入的时间会也必须得减少了。但是,本来水平就不高加上时间长不练手肯定越来越生。因此后面有闲暇时会练练letcode的题,并每隔不固定的一段时间进行一次总结整理。

0:

题目描述:

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

给出的代码段是:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {

    }
};

解题思路:

这是一道简单题,四个字总结“遍历数组”。

答案:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        for(int i=0;i<array.size();i++)
            for(int j=0;j<array[0].size();j++)
                if(array[i][j]==target)
                   return true;
        return false;
    }
};

一些问题:

为什么采用先行后列的遍历方式?

在计算机硬件层面,目前一般采用cpu+cache+主存共同工作。因此,当cpu需要访问主存数据时,会先从cache中找,如果cache未命中才从主存里取,而主存里的数据一般以行为单位映射于cache中,同时,cpu访问cache所需的时间远小于cpu访问主存所需的时间,因此,采用先行后列的遍历方式效率更高。

怎么知道的数组大小?

vector是c++提供的一个容器,不做赘述,此处可理解为定义二维动态数组array,而vector类中提供一个size()函数来返回数组中元素个数。

1:

题目描述:

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

示例 1:

输入: 123
输出: 321


 示例 2:

输入: -123
输出: -321


示例 3:

输入: 120
输出: 21


注意:

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

来源:力扣(LeetCode)

解题思路:

整数反转,核心问题即为利用while循环加取余计算出该数的每一位,再将逆序利用乘法回复为整数。

需要注意几点:

  • 负数的处理

        在运算前加if语句如果为负数取绝对值并记录(此处记录是因为后面返回逆序整数时如果输入为负则需返回负)。

  • 溢出判断

         题目中假设环境中只能存储32位有符号整数,即如果传入的数在-2147483647到2147483648之间才可进行运算负责直接返          回0。需要注意除开始进行溢出判断外在求出传入数据的每一位后准备逆序重组时需再进行溢出判断(例如:输入                       1000000009如逆序后为9000000001溢出)。

我的弱鸡答案:

int reverse(int x){
    int num[32] = {0};
    int i = 0;
    int count = 0;
    int end = 0;
    bool flag = true;
    if(x>2147483648||x<-2147483647)
    {
        return 0;
    }
    if(x<0)
    {
        flag = false;
        x = abs(x);
    }
    while(x!=0)
    {
        count++;
        num[i] = x%10;
        x = x/10;
        i++;
    }
    i = 0;
    while(count!=0)
    {
        if(count>9&&num[0]>2)
            return 0;
        end = end+num[i]*pow(10,count-1);
        if(end>2147483648||end<-2147483647)
            return 0;
        count--;
        i++;
    }

    if(!flag)
    {
        end = end*-1;
    }
    
    return end;

}

大佬的答案:

int reverse(int x)
{
    int max = 0x7fffffff, min = 0x80000000;//int的最大值最小值
    long rs = 0;//用long类型判断溢出
    for(;x;rs = rs*10+x%10,x/=10);//逆序,正负通吃,不用单独考虑负值
    return rs>max||rs<min?0:rs;//超了最大值低于最小值就返回0
}

此答案整体思路为边计算每一位边恢复逆序整数,缺点在于进行一步运算都需要判断是否溢出(精简了代码但是增加了执行耗时)。但是,刚看到此答案时的确惊艳到了博主。正真的表现出了c语言的简洁美。

一些感想:

博主感觉做一道编程题时,写出能通过全部测试用例的代码只是第一步,在此之后自己将自己的答案做到最优,然后浏览网上大佬们的解法,弃其糟粕,取其精华。再将其和自己的代码结合找出最优解。

最后,博主水平有限,行文及代码中不免出现问题,请各位雅正!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值