两个面试都挂掉了。感觉自己真的特别特别幸运能被第一家公司认可。也愈发觉得不能辜负他们的信任,真的要好好做,好好学,不要让他们后悔选到我😭。
这道Leetcode上的题是这样的:
Given an array nums and a value val, remove all instances of that value in-place and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example 1:
Given nums = [3,2,2,3], val = 3, Your function should return length = 2, with the first two elements of nums being 2. It doesn't matter what you leave beyond the returned length.
中文简单概括一下,就是在原数组上进行操作,使值为val的元素都放到数组后面去,然后返回前面没被删除的元素的长度。换句话说,不要的元素也都被移除了。
实话说我到现在都不知道在解题的时候,应该怎样想思路(大概还是刷题刷的少吧)。以下有两种思路,均来自discussion board。
第一种方法:
用两个指针
思路是:做这个remove操作,实际上可以想作是将所有不是目标值val的元素值,按顺序依次赋值到数组里。
这样我们需要两个指针,一个指针跑得快,用来判断每个元素值是否与val相等;另一个指针跑得慢,每次赋值之后才会前进一位,这样才能保证赋值时是从头到尾按顺序一个一个来了。有了这个思路,代码该怎样写就清晰很多。
function removeElement(nums,val){
if(!nums) return 0;
let slow=0;
for(let fast=0;fast<nums.length;fast++){
if(nums[fast]!==val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
第二种方法:
用JS自带的函数 splice()
这个方法的思路也很简单。
既然要remove掉所有值为val的元素,那自然就真的remove掉咯。这里就可以用到js中一个原生方法:splice()
在遍历数组的时候,如果遇到值为val的元素,就用splice()方法将这个元素删除掉。再接着遍历。遍历一遍之后,剩下的数组就正好是我们需要的(注意:原生JS中没有remove方法喔,remove方法是Jquery的)。
function removeElement(nums,val){
if(!nums) return 0;
for(let i=0;i<nums.length;i++){
if(nums[i]===val){
nums.splice(i,1);
i--;//由于删除了一个元素,原本在i+1位置的元素前进了一个位置,所以这里要先减1
}
}
return nums.length;
}
其实这些思路都很简单,为什么想的时候就是脑子乱乱的呢?也许以后写代码之前应该先把思路答出来,而不是在脑子里空想。然后再看着自己的思路再打。
今天学到的新的JS的一些函数方法啥的:(以后每天都记录一下把(๑•̀ㅂ•́)و✧
- 👻string的方法里有一个s1.indexOf(s2) 用处是可以返回字符串s1中,子字符串s2是从哪一个index开始的。如果这个不是s1的子字符串,就会返回-1。
- 👻函数返回的时候有时会有这种形式:
return A && B;
其中A和B都是表达式。这个其实代表的是:
if (A){return B;} else {return A;}
相应的也有下面这种形式:
return A || B;
这其实代表的是:
if (A) return A; else return B;
这就是所谓的短路求值(short-circuit evaluation),很基础的知识啦,很多语言都是这样的。