数据结构——LeetCode刷题:7. 整数反转,66. 加一,1. 两数之和
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;
}
};
代码思路
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;
}
}
代码思路
- 初始化变量:使用一个
long
类型的变量n
来存储反转过程中的中间结果,初始值为 0。这是因为在反转过程中可能会出现超出int
范围的值,而long
类型可以容纳更大范围的整数。 - 循环反转整数:进入一个
while
循环,循环条件是输入的整数x
不为 0。在每次循环中执行以下操作:n = n * 10 + x % 10;
:这里首先将当前的n
乘以 10,为新的数字腾出个位位置,然后加上x
的最后一位数字(通过x % 10
获取),实现将数字反转的效果。x = x / 10;
:将x
除以 10,去掉最后一位数字,以便下一次循环处理更高位的数字。 - 检查结果是否在
int
范围内并返回:使用条件表达式(int)n == n? (int)n : 0
来判断反转后的结果n
是否在int
范围内。如果强制转换int
类型后与n
相等,说明n
在int
范围内,此时返回(int)n
;如果不相等,说明超出了int
范围,返回 0。
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;
}
};
代码思路
- 初始化变量:创建一个空的结果数组
ret
。i
初始值为n - 1
,用于从数组的最后一个元素开始遍历。p
初始值为 1,表示要进行的加一操作。n
表示输入数组d
的大小。 - 遍历数组进行加一操作:
- 每次循环结束后,将
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. 两数之和
题目描述
给定一个整数数组 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 {};
}
};
代码思路
- 初始化数据结构:获取输入数组
nums
的大小n
。 - 创建一个哈希表(在 C++ 中使用
unordered_map
实现)map
,用于存储已经遍历过的数字及其下标。 - 遍历数组查找两数之和:在每次循环中,检查当前元素
nums[i]
是否在哈希表map
中:如果在哈希表中,说明之前已经遍历到了一个数字与当前数字之和等于目标值。此时,返回一个包含两个下标的数组,第一个下标是哈希表中当前数字对应的下标(即之前遍历到的与当前数字之和为目标值的数字的下标),第二个下标是当前循环变量i
。如果不在哈希表中,将目标值与当前数字的差值(即需要与当前数字相加得到目标值的数字)以及当前下标i
存入哈希表map
中,以便后续遍历中查找。 - 使用一个循环遍历输入数组
nums
,从第一个元素开始,循环变量为i
。 - 返回结果:如果遍历完整个数组都没有找到满足条件的两个数字,则返回一个空的数组。
原文地址:https://blog.csdn.net/u014114223/article/details/142358846
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!