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;
};