LeetCode 数组相关算法题

合并两个有序数组

function mergeArrays(arr1, arr2) {
  let mergedArray = [];
  let index1 = 0;
  let index2 = 0;
 
  while (index1 < arr1.length && index2 < arr2.length) {
    if (arr1[index1] < arr2[index2]) {
      mergedArray.push(arr1[index1]);
      index1++;
    } else {
      mergedArray.push(arr2[index2]);
      index2++;
    }
  }
 
  // 将剩余的元素追加到合并数组中
  while (index1 < arr1.length) {
    mergedArray.push(arr1[index1]);
    index1++;
  }
 
  while (index2 < arr2.length) {
    mergedArray.push(arr2[index2]);
    index2++;
  }
 
  return mergedArray;
}
 
const arr1 = [1, 3, 5, 7];
const arr2 = [2, 4, 6, 8];
console.log(mergeArrays(arr1, arr2));  // 输出 [1, 2, 3, 4, 5, 6, 7, 8]

移除元素

function removeElement(arr, val) {
  const index = arr.indexOf(val);
  if (index > -1) {
    arr.splice(index, 1);
  }
  return arr;
}

删除有序数组中的重复项

function removeDuplicates(nums) {
  if (nums.length === 0) return 0;
  let i = 0;
  for (let j = 1; j < nums.length; j++) {
    if (nums[j] !== nums[i]) {
      i++;
      nums[i] = nums[j];
    }
  }
  return i + 1;
}

多数元素

function majorityElement(nums) {
    let map = {};
    let len = nums.length;
    let majority = -1;
 
    // 统计每个元素出现的次数
    nums.forEach(function(num) {
        map[num] = (map[num] || 0) + 1;
        if (map[num] > len / 2) majority = num;
    });
 
    return majority;
}
 
// 示例
let nums = [3, 2, 3, 1, 3, 3, 2];
console.log(majorityElement(nums)); // 输出 3

轮转数组

function rotateArray(arr, n) {
  n = n % arr.length; // 处理n为负数或大于数组长度的情况
  return arr.slice(-n).concat(arr.slice(0, -n));
}
 
// 示例
var arr = [1, 2, 3, 4, 5];
var rotatedArr = rotateArray(arr, 2); // 将数组向前移动2个位置
console.log(rotatedArr); // 输出: [3, 4, 5, 1, 2]

买卖股票最佳时机

function maxProfit(prices) {
    let minPrice = Infinity;
    let maxProfit = 0;
 
    for (let price of prices) {
        if (price < minPrice) {
            minPrice = price;
        } else if (price - minPrice > maxProfit) {
            maxProfit = price - minPrice;
        }
    }
 
    return maxProfit ? maxProfit : 0;
}
 
// 示例使用
const prices = [7, 1, 5, 3, 6, 4];
console.log(maxProfit(prices));  // 输出: 5

跳跃游戏

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
    let reach = 0;
    for (let i = 0; i < nums.length; i++) {
        if (i > reach) {
            return false;
        }
        reach = Math.max(reach, i + nums[i]);
        if (reach >= nums.length - 1) {
            return true;
        }
    }
    return reach >= nums.length - 1;
};

O(1) 时间插入、删除和获取随机元素

class RandomizedSet {
    constructor() {
        this.elements = [];
        this.positions = new Map();
    }
 
    insert(val) {
        if (this.positions.has(val)) return false;
        this.elements.push(val);
        this.positions.set(val, this.elements.length - 1);
        return true;
    }
 
    remove(val) {
        if (!this.positions.has(val)) return false;
        const index = this.positions.get(val);
        // 将要删除的元素与数组的最后一个元素交换
        this.positions.set(this.elements[this.elements.length - 1], index);
        this.elements[index] = this.elements[this.elements.length - 1];
        // 删除映射表中的记录和数组的最后一个元素
        this.positions.delete(val);
        this.elements.pop();
        return true;
    }
 
    getRandom() {
        const randomIndex = Math.floor(Math.random() * this.elements.length);
        return this.elements[randomIndex];
    }
}

除自身以外数组的乘积

分发糖果

      const guo = (arr) => {
            let tangguo = arr.length;

            for (let i = 1; i < arr.length; i++) {
                if (arr[i] !== arr[i - 1]) {
                    tangguo += 1;
                }
            }

            return tangguo;
        };

        console.log('-----guo([1, 1, 42, 33, 4]);', guo([1, 1, 42, 33, 4]));

罗马数字转整数

     function romanToInt(s) {
            const romanMap = {
                I: 1,
                V: 5,
                X: 10,
                L: 50,
                C: 100,
                D: 500,
                M: 1000
            };

            let result = 0;

            for (let i = 0; i < s.length; i++) {
                if (romanMap[s[i]] < romanMap[s[i + 1]]) {
                    result -= romanMap[s[i]];
                } else {
                    result += romanMap[s[i]];
                }
            }

            return result;
        }

整数转罗马数字

function intToRoman(num) {
  const romanNums = [
    { value: 1000, symbol: 'M' },
    { value: 900, symbol: 'CM' },
    { value: 500, symbol: 'D' },
    { value: 400, symbol: 'CD' },
    { value: 100, symbol: 'C' },
    { value: 90, symbol: 'XC' },
    { value: 50, symbol: 'L' },
    { value: 40, symbol: 'XL' },
    { value: 10, symbol: 'X' },
    { value: 9, symbol: 'IX' },
    { value: 5, symbol: 'V' },
    { value: 4, symbol: 'IV' },
    { value: 1, symbol: 'I' },
  ];
  
  let result = '';
  
  for (let i = 0; i < romanNums.length; i++) {
    while (num >= romanNums[i].value) {
      result += romanNums[i].symbol;
      num -= romanNums[i].value;
    }
  }
  
  return result;
}

最后一个单词的长度

function getLastWordLength(str) {
  const words = str.split(' ');
  const lastWord = words[words.length - 1];
  return lastWord ? lastWord.length : 0;
}
 
// 示例使用
const str = "Hello World";
console.log(getLastWordLength(str)); // 输出: 5

最长公共前缀

function longestCommonPrefix(strs) {
    if (strs.length === 0) return "";
 
    let prefix = strs[0];
    for (let i = 1; i < strs.length; i++) {
        prefix = commonPrefix(prefix, strs[i]);
        if (prefix === "") {
            return "";
        }
    }
    return prefix;
}
 
function commonPrefix(str1, str2) {
    let min = Math.min(str1.length, str2.length);
    for (let i = 0; i < min; i++) {
        if (str1[i] !== str2[i]) {
            return str1.substring(0, i);
        }
    }
    return str1.substring(0, min);
}

反转字符串中的单词

function reverseWordsInString(str) {
  return str.split(' ').reverse().join(' ');
}
 
// 示例使用
const originalString = "Hello World!";
const reversedString = reverseWordsInString(originalString);
console.log(reversedString); // 输出: "World! Hello"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值