算法题

2 篇文章 0 订阅

算法题

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));//溢出

32位整数翻转
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:如果大家要用网站刷算法题的时候,注意你点进去的时候最左侧有个题目描述,那个才是真的题目,不要被一开始的题目骗了,这一点很重要。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值