js解leetcode(48)-简单

1.数组中两元素的最大乘积

题目:

给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。

请你计算并返回该式的最大值。

思路:排序之后取前两个元素或者用两个变量找出最大值和次大值

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function(nums) {
  nums.sort((a, b) => b - a);
  return (nums[0] - 1) * (nums[1] - 1);
};
/**
 * @param {number[]} nums
 * @return {number}
 */
var maxProduct = function(nums) {
  let v1 =  -Infinity;
  let v2 = -Infinity;
  for (const n of nums) {
    if (n > v1) {
      v2 = v1;
      v1 = n;
    } else if (n >= v2) {
      v2 = n;
    }
  }
  return (v1 - 1) * (v2 - 1);
};

2.重新排列数组

题目:

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

思路:穿插数组,和之前一题链表的很像。可以分成两个子数组然后依次取出第一个元素推入结果,也可以先计算出每个元素在新数组的下标,然后映射

/**
 * @param {number[]} nums
 * @param {number} n
 * @return {number[]}
 */
var shuffle = function(nums, n) {
const left=nums.slice(0,n);
const right=nums.slice(n);
const res=[]
let v=0;
while(v<2*n){
if(v%2){
    res.push(right.shift())
}else{
    res.push(left.shift())
}
v++
}
return res
};
/**
 * @param {number[]} nums
 * @param {number} n
 * @return {number[]}
 */
var shuffle = function(nums, n) {
  const res = new Array(2 * n);
  const list = new Array(2 * n);
  for (let i = 0; i < n; i++) {
    res[i] = 2 * i;
  }
  for (let i = n; i < 2 * n; i++) {
    res[i] = 2 * (i - n) + 1;
  }
  for (let i = 0; i < 2 * n; i++) {
    list[res[i]] = nums[i];
  }
  return list;
};

3.商品折扣后的最终价格

题目:

给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。

商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相等的折扣,其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足条件的 j ,你将没有任何折扣。

请你返回一个数组,数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。

思路:依次查找

/**
 * @param {number[]} prices
 * @return {number[]}
 */
var finalPrices = function(prices) {
  const l = prices.length;
  const res = new Array(l).fill(0);
  for (let i = 0; i < l - 1; i++) {
    for (let j = i + 1; j < l; j++) {
      if (prices[j] <= prices[i]) {
        res[i] = prices[j];
        break;
      }
    }
  }
  for (let i = 0; i < l; i++) {
    res[i] = prices[i] - res[i];
  }
  return res;
};

4.一维数组的动态和

题目:

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。

请返回 nums 的动态和。

思路:动态规划

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var runningSum = function(nums) {
  const l = nums.length;
  for (let i = 1; i < l; i++) {
    nums[i] = nums[i] + nums[i - 1];
  }
  return nums;
};

5.数组异或操作

题目:

给你两个整数,n 和 start 。

数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。

请返回 nums 中所有元素按位异或(XOR)后得到的结果。

思路:依次操作

/**
 * @param {number} n
 * @param {number} start
 * @return {number}
 */
var xorOperation = function(n, start) {
  let res = start;
  for (let i = 1; i < n; i++) {
    start += 2;
    res ^= start;
  }
  return res;
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值