第二周算法周报

本文介绍了如何找到整数数组中三个数的最大乘积,并提供了两种算法实现。第一种情况考虑了数组中正负数的组合,以获取最大乘积。第二种情况是判断一个整数是否为回文数,主要通过反转数字并与原数比较。这两个问题都是通过巧妙的数学和编程技巧解决的。
摘要由CSDN通过智能技术生成

628.三个数的最大乘积
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:

输入:nums = [1,2,3]
输出:6
示例 2:

输入:nums = [1,2,3,4]
输出:24
示例 3:

输入:nums = [-1,-2,-3]
输出:-6

提示:

3 <= nums.length <= 104
-1000 <= nums[i] <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
           int len=nums.size();
           if(len<3) return 0;
           sort(nums.begin(),nums.end());
           int max1,max2,max3;
            if(nums[0]>0||nums[len-1]<0)
           {
               max1=nums[len-1];
               max2=nums[len-2];
               max3=nums[len-3];
               return max1*max2*max3;
           }
           else if(nums[len-2]<0)
           {
               max1=nums[0];
               max2=nums[ 1];
               max3=nums[len-1];
               return max1*max2*max3;
           }
           else if(nums[len-1]*nums[len-2]*nums[len-3]>nums[len-1]*nums[0]*nums[1]&&nums[len-3]>0)
           {
               max1=nums[len-1];
               max2=nums[len-2];
               max3=nums[len-3];
               return max1*max2*max3;
           }
           else
           {
               return nums[len-1]*nums[0]*nums[1];
           }
            
    
    }
};

思路:
1.要先设置一个变量len=nums.size();//这是因为要确定数组长度
2.因为数组里的数字是杂乱无章的,所以要先进行排序(这里我用了冒泡但是最后是超时了)sort(nums.begin(),nums.end());题解都是这样进行排序的,用了之后就通过了
3.因为要三个元素的乘积的最大值,所以要设置三个变量max1,max2,max3
4.这里有三种情况第一种是全部的元素大于0,那就用数组最后三个元素相乘即可
5.第二种情况是只有一个正数,那就用数组元素的第一个元素和第二个元素还有最后一个元素进行相乘因为第一个和第二个元素是数组最小的两个数并且为负数,所以相乘之后得最大的两个正数再成一个最大的正数即可
6.第三种就是如果数组最后三个元素相乘和数组第一个和第二个还有最后一个相乘进行比较并且倒数第三个元素要大于0,因为要保证第二个数是大于0的

9.回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true
示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    bool isPalindrome(int x) {
      if(x<0||x%10==0&&x!=0)
            return false;
        long b=0;
        int a=x;
        while(x)
        {
            b=b*10+x%10;
            x=x/10;
        }
        
        return b==a?true:false;
    }
    
};

思路:
1.首先回文数不能小于0或者数字的尾部不能为0,因为这样不能构成回文数
例如:-121 倒过来之后121-这不是回文数
例如:1210 倒过来之后变成0121,这不是一个回文数因为数字的首部不能为0除法这个数本身就为0
2.要是都不是上面的类型那就用一个循环来处理这个数,我们可以设置一个变量b=0;必须等于0
并且为long,因为这个数处理了之后可能会溢出,所以用long来避免这个问题,再设置一个变量a=x;
b=b*10+x%10;这个表达式是为了把每次将x最后一位数字进行加和然后把前一位的数字乘10就能达到倒置的目的
3.最后一步判断一下b是不是等于x等于就是回文数不等于就不是
例如:121倒置之后还是121

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值