239.滑动窗口最大值
239.滑动窗口最大值描述给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
示例
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
-——————— —————
[1 3 -1] -3 5 3 6 7 => 3
1 [3 -1 -3] 5 3 6 7 => 3
1 3 [-1 -3 5] 3 6 7 => 5
1 3 -1 [-3 5 3] 6 7 => 5
1 3 -1 -3 [5 3 6] 7 => 6
1 3 -1 -3 5 [3 6 7] => 7
代码及思路思路其实开始感觉这个题目没啥难度,不知道为啥是困难 ...
JS原生函数实现之数组实例方法map/reduce
JS原生函数实现之数组实例方法map/reduce
123456789101112Array.prototype.map2 = function (fn, thisVal) { if (typeof fn != 'function') { throw new Error(fn + 'should be function'); } if (this.length == 0) { return []; } return this.reduce((arr, curVal, curIndex) => { arr.push(fn.call(thisVal, curVal, curIndex, this)); return arr; }, [])};
1234567Array.prototype.reduce2 = function (callback, initData) { let initVal = initData ...
JS原生函数实现之call、apply、bind
JS原生函数实现之call/apply/bind1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374let foo = { a: 10}function bar(name, age) { console.log(name, age); console.log(this.a);}/*let foo = { a: 10, bar: function(name,age) { console.log(name, age); console.log(this.a); }}foo.bar();//10*/Function.prototype.call2 = function (context) { let _context = context || window ...
1103.分糖果II
1103.分糖果II描述排排坐,分糖果。
我们买了一些糖果 candies,打算把它们分给排好队的 n = num_people 个小朋友。
给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。
然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。
重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为 num_people、元素之和为 candies 的数组,以表示糖果的最终分发情况(即 ans[i] 表示第 i 个小朋友分到的糖果数)。
示例
示例 1:
输入:candies = 7, num_people = 4
输出:[1,2,3,1]
解释:
第一次,ans[0] += 1,数组变为 [1,0,0,0]。
第二次,ans[1] += 2,数组变为 [1,2,0,0]。
第 ...
0~n-1中缺失的数字
0~n-1中缺失的数字描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
代码及思路思路题目中的关键信息:长度为n-1, 但有n个数字(0~n-1), 数字递增, 有且只有一个数字不在该数组中。
通过这几个关键信息我们可以得出的结论是:只能按照间隔为1进行递增,如果后一个数字减去前一个数字大于1,那说明这两个数字之间的数即为缺失的数字。
但这个是一般情况,考虑特殊情况: [1,2,3]和[0,1,2],缺少的数字分别是是0和3,但是后一个数字减去前一个数字都为1。这种情况要单独处理一下。
还有一种情况(最开始未考虑导致未通过): 如果数组的长度为1.[0] 或者 [1],也要单独考虑。
代码12345678910111213141516/** * @param {number[]} nums * @re ...
顺次数
1291.顺次数描述我们定义「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。
请你返回由 [low, high] 范围内所有顺次数组成的 有序 列表(从小到大排序)。
示例
示例 1:
输出:low = 100, high = 300
输出:[123,234]
示例 2:
输出:low = 1000, high = 13000
输出:[1234,2345,3456,4567,5678,6789,12345]
提示:
10 <= low <= high <= 10^9
代码及思路思路我的这个思路比较暴力,不是很好。首先想的是把这两个数字转为字符串,然后可以知道是几位数。小数的最高位加上其「长度减一」,如果大于或等于10,说明在这个长度下不会存在连续数。所以长度应该加一,最高为置为1。如果小于10,那么就循环从最高位加到最低位,即为一个结果。
举个栗子:low=100, high=1000那么low_len = 3, high_len = 4; 100的最高位是1, 1 + low_len = 4 < 10, 所以存在连续数 ...
连续赋值
关于连续赋值的问题题目12345let a = { n: 1 };let b = a;a.x = a = { n: 2 };console.log(a.x);console.log(b.x);
具体的文字描述引用知乎大佬的解释,说的比较到位:
12let a = { n: 1 };let b = a;
这两行比较好理解。在栈内存中,a与b是不同的,是两个变量,但是他们的指针是相同的,指向同一个堆。
关键点来啦:
1a.x = a = { n: 2 };
JS成员访问的优先级要比赋值运算高。先获取等号左侧的a.x,但a.x并不存在,于是JS为(堆内存中的)对象创建一个新成员x,这个成员的初始值为undefined.
(这也是为什么直接引用一个未定义的变量会报错,但是直接引用一个对象的不存在的成员时,会返回undefined.)
创建完成后,目标指针已经指向了这个新成员x,并会先挂起,单等等号右侧的内容有结果了,便完成赋值。
接着执行赋值语句的右侧,发现a={n:2}是个简单的赋值操作,于是a的新值等于了{n ...
宝石与石头
771. 宝石与石头描述给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。 S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此”a”和”A”是不同类型的石头。
示例
示例 1:
输入: J = “aA”, S = “aAAbbbb”
输出: 3
示例 2:
输入: J = “z”, S = “ZZ”
输出: 0
注意:
S 和 J 最多含有50个字母。
J 中的字符不重复。
代码及思路思路想着是把宝石J和石头S字符串转为数组。然后利用filter方法过滤出石头数组中包含的宝石,取其长度。
代码1234567891011121314/** * @param {string} J * @param {string} S * @return {number} */var numJewelsInStones = function(J, S) { let jArr = J.split(& ...
设计哈希集合
705.设计哈希集合描述不使用任何内建的哈希表库设计一个哈希集合
具体地说,你的设计应该包含以下的功能
add(value):向哈希集合中插入一个值。
contains(value) :返回哈希集合中是否存在这个值。
remove(value):将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
注意:
所有的值都在 [0, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希集合库。
示例123456789MyHashSet hashSet = new MyHashSet();hashSet.add(1);hashSet.add(2);hashSet.contains(1);// 返回 truehashSet.contains(3);// 返回 false (未找到)hashSet.add(2);hashSet.contains(2);// 返回 truehashSet.remove(2);hashSet.contains(2);// 返回 false (已经被删除)
代码及思路思路利用数组的push,includes,s ...
检测大写字母
520. 检测大写字母描述给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如”USA”。
单词中所有字母都不是大写,比如”leetcode”。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google”。
否则,我们定义这个单词没有正确使用大写字母。
输入是由大写和小写拉丁字母组成的非空单词
示例
示例1
输入: “USA”
输出: True
示例2
输入: “FlaG”
输出: False
代码及思路思路如果是全部大写那么 str.toUpperCase() === str;
如果是全部小写那么 str.toLowerCase() === str;
如果str[0].toUpperCase() + str.slice(1).toLowerCase() === str,说明首字母大写,其他小写。
否则 返回false。
代码12345678910/** * @param {string} word * @return {boolean} */let dete ...