题目一
1. 两数之和
难度简单9570收藏分享切换为英文接收动态反馈
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我的答案
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length; i++){
for(int j = i+1; j < nums.length; j++){
if((nums[i] + nums[j]) == target){
return new int[]{i, j};
}
}
}
return null;
}
}
复杂度过高
正确答案
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i])){
// 当遍历到第二个数时,由于map中已存在,就是通过target减去第一个数得到的
// 这时,只要取出第一个数的下标,和当前第二个数的下标返回即可
return new int[]{map.get(nums[i]), i};
}
map.put(target - nums[i], i); // key 放第二个数的值,value放第一个数的下标
}
return null;
}
}
题目二
7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
我的答案
class Solution {
public int reverse(int x) {
// long min = -(long) Math.pow(2, 31); // -2,147,483,648
// long max = (long) Math.pow(2, 31) -1; // 2,147,483,648 - 1
// 判断x可为负数
String fu = "";
if(x < 0)
fu += "-";
if(x == Integer.MIN_VALUE) {
// 如果是最小值直接返回 0
return 0;
}else {
String strX = String.valueOf(Math.abs(x)); // 绝对值转字符串
StringBuilder xBuilder = new StringBuilder(strX); // 换成StringBuilder
StringBuilder reverseX = xBuilder.reverse(); // 反转
reverseX.insert(0, fu); // 把符号插入进去
Long xLong = Long.parseLong(reverseX.toString()); // 强转会长整形
if (xLong > Integer.MAX_VALUE || xLong < Integer.MIN_VALUE ) {
return 0;
}else {
return Integer.parseInt(reverseX.toString());
}
}
}
}
NB答案
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;
}
题目三
9. 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
我的答案
class Solution {
public boolean isPalindrome(int x) {
if(x < 0) return false; // 负数肯定不是回文数
int y = x;
int n = 0;
while(x != 0){
n = n*10 + x%10;
x = x / 10;
}
return n == y;
}
}
最佳答案
class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
// 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber / 10;
}
}
本文档分析了LeetCode中的三个经典问题:两数之和、整数反转及回文数判断。提供了简洁高效的解决方案,并探讨了如何避免复杂度和溢出问题。
207

被折叠的 条评论
为什么被折叠?



