自学内容网 自学内容网

数据结构——LeetCode刷题:7. 整数反转,66. 加一,1. 两数之和

7. 整数反转

题目描述

7. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

运行代码(C++)

class Solution {
public:
    int reverse(int x) {
int result = 0;
    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        if (result > INT_MAX / 10 || (result == INT_MAX / 10 && pop > 7)) return 0;
        if (result < INT_MIN / 10 || (result == INT_MIN / 10 && pop < -8)) return 0;
        result = result * 10 + pop;
    }
    return result;
    }
};

代码思路

  1. reverse方法:
    • 初始化变量:创建一个整数变量result,用于存储反转后的结果,初始值为 0。
    • 循环反转整数:进入一个while循环,条件是输入整数x不为 0。在每次循环中,执行以下操作:int pop = x % 10;:获取x的最后一位数字,即通过取模 10 得到当前最低位的数字。x /= 10;:将x除以 10,去掉最后一位数字,以便下一次循环处理更高位的数字。
    • 检查是否越界:
      • 在每次循环中,都要检查反转后的结果是否会超出 32 位有符号整数的范围。
      • 对于正整数情况,如果result > INT_MAX / 10,说明当前结果已经大于最大整数除以 10 的值,再乘以 10 加上新的数字肯定会超出范围,直接返回 0。如果result == INT_MAX / 10 && pop > 7,说明当前结果正好是最大整数除以 10 的值,而新的数字大于 7,那么乘以 10 加上新数字也会超出范围,同样返回 0。
      • 对于负整数情况,类似的逻辑,如果result < INT_MIN / 10或者result == INT_MIN / 10 && pop < -8,也返回 0。
    • 更新结果:如果没有越界,执行result = result * 10 + pop;,将新的数字加到结果的末尾,实现整数的反转。
    • 返回结果:循环结束后,返回result作为反转后的整数,如果在循环过程中发生越界,则返回 0。

运行代码(java)

class Solution {
    public int reverse(int x) {
        long n=0;
        while(x!=0){
            n=n*10+x%10;
            x=x/10;
        }
        return (int)n==n?(int)n:0;
    }
}

代码思路

  1. 初始化变量:使用一个long类型的变量n来存储反转过程中的中间结果,初始值为 0。这是因为在反转过程中可能会出现超出int范围的值,而long类型可以容纳更大范围的整数。
  2. 循环反转整数:进入一个while循环,循环条件是输入的整数x不为 0。在每次循环中执行以下操作:n = n * 10 + x % 10;:这里首先将当前的n乘以 10,为新的数字腾出个位位置,然后加上x的最后一位数字(通过x % 10获取),实现将数字反转的效果。x = x / 10;:将x除以 10,去掉最后一位数字,以便下一次循环处理更高位的数字。
  3. 检查结果是否在int范围内并返回:使用条件表达式(int)n == n? (int)n : 0来判断反转后的结果n是否在int范围内。如果强制转换int类型后与n相等,说明nint范围内,此时返回(int)n;如果不相等,说明超出了int范围,返回 0。

66. 加一

题目描述

66. 加一

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

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

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

运行代码(C++)

class Solution {
public:
    vector<int> plusOne(vector<int>& d) {
        int n = d.size();
        int p = 1;
        int i = n-1;
        vector<int> ret;
        while(i >= 0){
            if(p == 1 && d[i] == 9){
                // d[i] = 0;
                ret.push_back(0);
            }else{
                // d[i] += p;
                ret.push_back(d[i] + p);
                p = 0;
                // break;
            }
            --i;
        }
        if(p) ret.push_back(1);
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

代码思路

  1. 初始化变量:创建一个空的结果数组reti初始值为n - 1,用于从数组的最后一个元素开始遍历。p初始值为 1,表示要进行的加一操作。n表示输入数组d的大小。
  2. 遍历数组进行加一操作:
    • 每次循环结束后,将i减一,继续处理前一位数字。
    • 如果不是上述情况:将当前数组元素d[i]加上进位p后添加到结果数组ret中。将进位p置为 0,表示当前位加一操作已完成,没有进位产生。
    • 如果当前进位p为 1 且当前数组元素d[i]为 9:将当前结果数组ret中添加数字 0,表示当前位加一后产生进位,当前位变为 0。
    • 进入一个while循环,条件是i >= 0,即从数组的最后一个元素开始向前遍历。
    • 处理最高位进位:如果在遍历完整个数组后,进位p仍然为 1,说明最高位需要进位,将数字 1 添加到结果数组ret中。
    • 反转结果数组并返回:由于在前面的操作中是从低位到高位构建结果数组,而最终结果应该是从高位到低位,所以调用reverse函数将结果数组反转。返回反转后的结果数组ret

1. 两数之和

题目描述

1. 两数之和

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

运行代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> map;
        int n = nums.size();
        for(int i = 0; i < n; i++){
            if(map.find(nums[i])!=map.end()) return {map[nums[i]], i};
            map[target- nums[i]] = i;
        }
        return {};
    }
};

代码思路

  1. 初始化数据结构:获取输入数组nums的大小n
  2. 创建一个哈希表(在 C++ 中使用unordered_map实现)map,用于存储已经遍历过的数字及其下标。
  3. 遍历数组查找两数之和:在每次循环中,检查当前元素nums[i]是否在哈希表map中:如果在哈希表中,说明之前已经遍历到了一个数字与当前数字之和等于目标值。此时,返回一个包含两个下标的数组,第一个下标是哈希表中当前数字对应的下标(即之前遍历到的与当前数字之和为目标值的数字的下标),第二个下标是当前循环变量i。如果不在哈希表中,将目标值与当前数字的差值(即需要与当前数字相加得到目标值的数字)以及当前下标i存入哈希表map中,以便后续遍历中查找。
  4. 使用一个循环遍历输入数组nums,从第一个元素开始,循环变量为i
  5. 返回结果:如果遍历完整个数组都没有找到满足条件的两个数字,则返回一个空的数组。

原文地址:https://blog.csdn.net/u014114223/article/details/142358846

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!