LeetCode - 简单
7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
- 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
/**
* @param {number} x
* @return {number}
*/
const reverse = x => {
if (x > Math.pow(2, 31) - 1 || x < -Math.pow(2, 31)) {
return;
}
let ifNegative = false; // 负数判断
let xStringed = String(x); // 转化为字符串
let noCharNum = ''; // 用于存放无符号数字
if (xStringed.includes('-')) {
ifNegative = true;
noCharNum = xStringed.slice(1);
} else {
noCharNum = xStringed;
}
// 反转
let resNum = Number(
noCharNum
.split('')
.reverse()
.join('')
);
if (ifNegative) {
resNum = -resNum;
}
if (resNum > Math.pow(2, 31) - 1 || resNum < -Math.pow(2, 31)) {
return 0;
}
return resNum;
};
9. 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
/**
* @param {number} x
* @return {boolean}
*/
const isPalindrome = function(x) {
let s = 0;
for (let i = 0; i < x.toString().length / 2; i++) {
if (x.toString()[i] == x.toString()[x.toString().length - 1 - i]) {
s++;
}
}
return s == Math.ceil(x.toString().length / 2);
};
14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
- 所有输入只包含小写字母 a-z 。
/**
* @param {string[]} strs
* @return {string}
*/
const longestCommonPrefix = strs => {
if (strs.length <= 0) {
return '';
}
for (let i = 0; i < strs[0].length; i++) {
for (let j = 1; j < strs.length; j++) {
if (strs[j][i] !== strs[0][i]) {
return strs[0].substr(0, i);
}
}
}
return strs[0];
};
26. 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
- 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
/**
* @param {number[]} nums
* @return {number}
*/
const removeDuplicates = nums => {
let theNum;
for (let i = 0; i < nums.length; ) {
if (nums[i] === theNum) {
nums.splice(i, 1);
} else {
theNum = nums[i];
i++;
}
}
return nums.length;
};
28. 实现 strStr()
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从 0 开始)。如果不存在,则返回 -1。
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
const strStr = (haystack, needle) => {
let haystackLen = haystack.length;
let needleLen = needle.length;
if (!needleLen) {
return 0;
}
if (needleLen > haystackLen) {
return -1;
}
for (let i = 0; i <= haystackLen - needleLen; i++) {
let pivot = i;
for (let j = 0; j < needleLen; j++) {
if (haystack[pivot] == needle[j]) {
pivot++;
} else {
break;
}
}
if (pivot - i == needleLen) {
return i;
}
}
return -1;
};
118. 杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
- 在杨辉三角中,每个数是它左上方和右上方的数的和。
/**
* @param {number} numRows
* @return {number[][]}
*/
// 给定行数,生成帕斯卡三角形(杨辉三角)
// 思路:循环或递归
const generate = numRows => {
let res = [];
const create = arr => {
let len = arr.length;
if (len === 1) {
return [1, 1];
}
// 第一位是1
let res = [1];
for (let i = 1; i < len; ++i) {
res.push(arr[i - 1] + arr[i]);
}
// 最后一位也是1
res.push(1);
return res;
};
if (numRows > 0) {
res.push([1]);
for (let i = 1; i < numRows; ++i) {
let arr = create(res[i - 1]);
res.push(arr);
}
}
return res;
};
121. 买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
- 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
- 注意你不能在买入股票前卖出股票。
/**
* @param {number[]} prices
* @return {number}
*/
const maxProfit = prices => {
if (!prices) {
return 0;
}
let profit = 0;
let low = prices[0];
const len = prices.length;
for (let i = 1; i < len; i++) {
if (prices[i] < low) {
low = prices[i];
} else if (prices[i] - low > profit) {
profit = prices[i] - low;
}
}
return profit;
};
141. 环形链表
给定一个链表,判断链表中是否有环。
- 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
const hasCycle = head => {
if (!head) return false;
if (head.prev) return head.prev;
else {
head.prev = true;
return hasCycle(head.next);
}
};
169. 求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
- 你可以假设数组是非空的,并且给定的数组总是存在众数。
/**
* @param {number[]} nums
* @return {number}
*/
const majorityElement = function(nums) {
let counterMap = Object.create(null);
const len = nums.length;
let majorityEle;
let i = 0;
while (i < len) {
var num = nums[i];
if (!counterMap[num]) {
counterMap[num] = 1;
} else {
counterMap[num] += 1;
}
if (counterMap[num] > len >>> 1) {
majorityEle = num;
break;
}
i++;
}
return majorityEle;
};
189. 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的原地算法。
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
const rotate = (nums, k) => {
if (!k) return nums;
while (k--) nums.unshift(nums.pop());
};