LeetCode 189.轮转数组
//解法一,空间复杂度不是O(1)。最简单的解法了,需要注意的是k需要取余。
var rotate = function(nums, k) {
let len = nums.length;
if(len<=1) return;
let res = [];
k = k%len;
let start = len-k;
for(let i = start;i<len;i++){
res.push(nums[i]);
}
for(let i = 0;i<start;i++){
res.push(nums[i]);
}
nums.splice(0,len,...res);
};
//解法二,根据k决定要进行几次删除和插入的操作,超时了,不能通过。
var rotate = function(nums, k) {
let back = nums.length-1;
let store = 0;
k = k%nums.length;
console.log(k);
while(k--){
store = nums[back];
nums.pop();
nums.unshift(store);
}
};
//解法三,数组翻转,先翻转整个数组,然后把前k个元素翻转,再翻转另一部分的元素即可。
var rotate = function(nums, k) {
let len = nums.length;
if(len<=1) return;
k = k%len;
reverse(nums, 0, len-1);
reverse(nums, 0, k-1);
reverse(nums, k, len-1);
};
var reverse = (nums, left, right) =>{
while(left<right){
let store = nums[left];
nums[left++] = nums[right];
nums[right--] = store;
}
}
//方法四,环状替代,没整明白。
LeetCode 217.存在重复元素
//方法一,冒泡排序(快排,懒得写了)
var containsDuplicate = function(nums) {
for(let i =0;i<nums.length-1;i++){
for(let j =i;j<nums.length;j++){
if(nums[i]>nums[j]){
swap(nums, i, j);
}
}
}
for(let i =0;i<nums.length-1;i++){
if(nums[i]===nums[i+1]){
return true;
}
}
return false;
};
var swap = (nums, a, b)=>{
const c = nums[a];
nums[a] = nums[b];
nums[b] = c;
}
//方法二,借助set的特性来实现,如果有一个数出现了两次,set就会删掉这个数字,就和原数组的大小不一样了。
var containsDuplicate = function(nums) {
let set = new Set();
if(nums.length<=1) return false;
for(let i = 0;i<nums.length;i++){
if(set.has(nums[i])){
set.delete(nums[i]);
}
else{
set.add(nums[i]);
}
}
return set.size!==nums.length;
};
LeetCode 136.只出现一次的数字
//不用排序了,和上面一题做法一样,不同的是得到set里的唯一一个值就行,需要注意Set无法用下标读取元素,只能遍历。
var singleNumber = function(nums) {
let set = new Set();
if(nums.length<=1) return nums[0];
for(let i = 0;i<nums.length;i++){
if(set.has(nums[i])){
set.delete(nums[i]);
}
else{
set.add(nums[i]);
}
}
for(let i of set){
return i;
}
};
//骚不过官方,用异或运算符。尝试封装一个异或,封装不出来。=_=
var singleNumber = function(nums) {
let res = 0;
for(let i of nums){
res ^= i;
}
return res;
};
LeetCode 350.两个数组的交集
//方法一,类似最小面积矩形。根据一个数组建立一个map,key为数组元素,value为这个元素出现的次数(如果只是简单的set,不记录次数就会忽略重复的元素。)。然后根据另一个数组的元素来查找,如果有相同的元素就从map中删除,然后将这个元素加到要输出的数组中。
var intersect = function(nums1, nums2) {
let res = [];
let map = new Map();
for(let i of nums1){
if(map.has(i)){
let nums = map.get(i);
map.set(i, nums+1);
}
else{
map.set(i,1);
}
}
for(let i of nums2){
if(map.has(i)){
let nums = map.get(i);
nums-1>0?map.set(i, nums-1):map.delete(i);
res.push(i);
}
}
return res;
};
//方法二,排序加双指针。
var intersect = function(nums1, nums2) {
nums1.sort((a,b)=>a-b);
nums2.sort((a,b)=>a-b);
let res = [];
let point1 = 0;
let point2 = 0;
while(point1<nums1.length&&point2<nums2.length){
if(nums1[point1]===nums2[point2]){
res.push(nums1[point1++]);
point2++;
}
else if(nums1[point1]>nums2[point2]){
point2++;
}
else{
point1++;
}
}
return res;
};
LeetCode 66.加一
//方法一,从后向前加。
var plusOne = function(digits) {
let len = digits.length;
if(len===1&&digits[0]===0){
return [1];
}
let bool = 1;
for(let i = len-1;i>=0;i--){
digits[i] += bool;
bool = digits[i]>=10?1:0;
digits[i] %= 10;
}
if(bool===1){
digits.unshift(1);
}
return digits;
};
//方法二,从后往前找9。(注意一下,如果不是和最后一位连续的9,实际上也不会变成10的)
var plusOne = function(digits) {
let nums_nine = 0;
for(let i = digits.length-1;i>=0;i--){
if(digits[i]===9){
nums_nine++;//找连续的9
}
else{
break;
}
}
if(nums_nine===digits.length){//全为9
for(let i = 0;i<digits.length;i++){
digits[i] =0;
}
digits.unshift(1);
return digits;
}
let start = digits.length-1-nums_nine;
digits[start] += 1;
for(let i = start+1;i<digits.length;i++){//不全为9
digits[i] =0;
}
return digits;
};