1. 1比特与2比特字符
题目:
有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
思路:用队列的思路来解题,从开头开始,因为2比特字符肯定是1开头,所以遇到1,就下删除两个元素,遇到0就删除一个。最后如果只剩一个字符,那么就是0结束,如果最后两个字符以1开头,那么就不是0结束
/*** @param {number[]} bits* @return {boolean}*/
var isOneBitCharacter = function(bits) {const l = bits.length;if (l == 1) return true;if (l == 2) return bits[0] == 0;while (bits.length > 1) {if (bits[0] == 0) {bits.shift();} else {bits.splice(0, 2);}}return bits[0] == 0;
};
2.词典中最长的单词
题目:
给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。
若无答案,则返回空字符串。
思路:先生成set,遍历字符串,如果字符的每一个前缀都在set内,则这个单词符合要求。然后比较长度,取最长的。
/*** @param {string[]} words* @return {string}*/
var longestWord = function(words) {const set = new Set(words);let length = 0;let res = "";for (const s of words) {let flag = true;const l = s.length;if(l<length)continueif(l==length&&s>res)continuefor (let i = 1; i <= l; i++) {if (!set.has(s.slice(0, i))) {flag = false;break;}}if (flag) {if (l > length) {length = l;res = s;} else if (l == length && res > s) {res = s;}}}return res;
};
3.寻找数组的中心索引
题目:
给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。
我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
思路:用指针法。先计算数组的累计和,然后左侧和就是0,右侧和就是累计和-第一元素的差。然后移动指针,每次移动,左侧的和酒加上当前指针的前一个元素,右侧和酒减去当前指针的元素,返回第一个符合条件的下标
/*** @param {number[]} nums* @return {number}*/
var pivotIndex = function(nums) {const l = nums.length;if (!l) return -1;if (l == 1) return 0;let left = 0;let right = nums.reduce((a, b) => a + b);right -= nums[0];for (let i = 0; i < l; i++) {if (left == right) return i;left += nums[i];right -= nums[i + 1];}return -1;
};
4.自除数
题目:
自除数 是指可以被它包含的每一位数除尽的数。
例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
还有,自除数不允许包含 0 。
给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
思路:遍历,没啥好说的
/*** @param {number} left* @param {number} right* @return {number[]}*/
var selfDividingNumbers = function(left, right) {const res = [];for (let i = left; i <= right; i++) {if (validate(i)) res.push(i);}function validate(v) {for (const s of `${v}`) {if (s == "0") return false;if (v % +s) return false;}return true;}return res;
};
5.图像渲染
题目:
有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。
给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。
为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。
最后返回经过上色渲染后的图像。
思路:遍历,注意越界条件就行
/*** @param {number[][]} image* @param {number} sr* @param {number} sc* @param {number} newColor* @return {number[][]}*/
var floodFill = function(image, sr, sc, newColor) {const v = image[sr][sc];if(v===newColor)return imageconst h = image.length;const w = image[0].length;function fillColor(i, j, v) {if (i < 0 || i >= h) return;if (j < 0 || j >= w) return;if (image[i][j] !== v) return;image[i][j] = newColor;fillColor(i - 1, j,v);fillColor(i + 1, j,v);fillColor(i, j - 1,v);fillColor(i, j + 1,v);}fillColor(sr, sc, v);return image;
};