算法题
1. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
例如:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
首先我们看到了数组,那么看到数组,我们的第一反应是什么,没错,就是循环,通过循环来遍历所有的数组元素,其他的先不用管,反正先循环就对了。那么我们要遍历所有的数组元素的时候,循环条件就是小于数组的长度或小于等于数组长度减一。
然后要考虑的就是target=数组元素1+数组元素2,然后返回数组元素的下标,也叫索引,返回下标就很简单了,就返回初始化的变量就行了。那么我们要考虑的只有一个问题了,就是怎么找到这两个值.
我们可以用target减去数组元素,然后将得到的值跟被减的数组元素后面的元素比较,如果相等,返回下标就行了。在所有的循环结束之后如果还没有找到,那么就返回false.
var twoSum = function(nums, target) {
for(var i=0;i<nums.length;i++){//循环遍历数组中的全部元素
// 初始化
var a=target-nums[i]; //用target减去数组元素,然后给变量a
for(var j=i+1;j<nums.length;j++){//遍历被减的数组元素后面的所有元素
if(nums[j]===a){//剩下的元素与a比较
return [i,j]; //返回一个数组
}
}
}
return false; //循环结束没知道的话,返回false
};
console.log(twoSum([2,7,5,8],9));//有
console.log(twoSum([2,10,5,8],9));//没有
2. 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
上面的31为指数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
首先说到将数字翻转那么我们就想到了”取余“和”除“然后 “(变量=变量*10+取余得到的变量)”的三连操作(整数取余10可以得到最后一位,执行除的操作之后可以将最后一位删掉),但因为语言是js,那么,我们还要加上一个向下取整的过程,这里就需要用到数学函数Math.floor,但这里就有一个很恶心的点了,就是如果你Math.floor的参数是负数的话,他就会变成向上取整,所以我们在考虑负数的情况下,要加上一个判断语句如果传进来的值是负数的话,那么我们就要将向下取整变为向上取整,也就是Math.ceil这个数学函数。
最后判断溢出问题的话,有一个非常好用的数学函数来判断,就是Math.pow(底数,指数),这个函数的底数值可以为负,判断一下如果溢出就返回0就ok了
var reverse = function (x) {
var shu = 0;//注意变量必须赋0
while (x !== 0) {//循环条件
var a = x % 10;//取最后一位
x /= 10;//删除最后一位
if (x < 0) {//判断是否为负数
x = Math.ceil(x)//负数时需要向上取整
} else {
x = Math.floor(x);//整数时向下取整
}
shu = shu * 10 + a;//将数字和起来
if (shu < Math.pow(-2, 31) || shu > Math.pow(2, 31) - 1) {//判断是否溢出
return 0;
}
}
return shu;//返回值
};
console.log(reverse(123));
console.log(reverse(-321));
console.log(reverse(1534236469));//溢出
3.判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程:
判断一个数是否是回文数,那么首先可以确定的是负数都不是回文数,因为他有个符号,其次个位为0的数也不是回文数,因为,数字不可能0开头。
所以,现在就1个问题待解决:怎么理解这个正序倒序都一样的数。
正序倒序一样的数,也就是从中间分开之后,前面的也就是左面的与后面的翻转之后的数值一样,那么我们在不知道数值长度的情况下,怎么才能判断出中间的值在哪里。
我们现在来试想一下,中间值的左右两边的数字个数是不是相等的,那么后面的一定比前面的大的那一刻,是不是,我们就已经取到了中间值,因为位数一样的情况下,不能保证谁一定大 例如 1234 前面12 后面的翻转后为43 或者 8756 前面为87 后面翻转后为65 ,但如果取到了中间值,后面的位数就比前面的多,就一定比前面的大,因为我们取余是从后面取的值
最后,我们进行一下判断如果前方的值等于后面翻转的值,或等于后面翻转除10的值。那么他就是回文数,反之则不是。
var isPalindrome = function (x) {
if (x < 0 || (x % 10 === 0 && x !== 0)) {
return false;//负数或个位为0,并且不为0的数一定不为回文数
}
if (x === 0) {
return true;//0为回文数,(他没写在题目里,但提交代码后,它给出的错误为0的时候为true)
}
var y = 0;
while (x !== 0) {//判断条件
var z = x % 10;//取余
x = x / 10;//删除最后一位
x = Math.floor(x);//向下取整
y = y * 10 + z;//后面翻转的数
if (y > x || y === x) {//后面的数大于前面的数,或偶数时直接相等
if (y === x || x === Math.floor(y / 10)) {//奇数和偶数情况下的判断条件,数值为偶数位,相等;奇数位,后面的数/10后相等
return true;//返回true
}
else {
return false;//反之返回false
}
}
}
};
console.log(isPalindrome(1221));//ture
console.log(isPalindrome(-1));//false
console.log(isPalindrome(100));//false
console.log(isPalindrome(0));//true
console.log(isPalindrome(12321));//true
由于本人是一个编程小白,今天这也是第一次比较正式的接触算法题,如有错误和不足还请大家多多包涵,以及多多指正.我也会尽我最大的努力保证发的代码和说话的正确性。
愿与大家一起努力。
ps:今天的算法题都出自leetcode这个网站,感兴趣的话,可以点击下面的网址。
https://leetcode-cn.com/problemset/algorithms/
pps:另外大家如果有什么比较好的、比较系统的算法类的书籍也可以推荐给我,感谢!
ppps:如果大家要用网站刷算法题的时候,注意你点进去的时候最左侧有个题目描述,那个才是真的题目,不要被一开始的题目骗了,这一点很重要。