一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
交换法
/**
* @param {number[]} nums
* @return {number[]} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let flag = 0
for (let i = 0; i < nums.length; i ++) {
if (nums[i] !== 0) {
nums[flag++] = nums[i]
}
}
while(flag < nums.length) {
nums[flag++] = 0
}
return nums
};
统计个数且交换法
/**
* @param {number[]} nums
* @return {number[]} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let temp = 0 // 统计0的个数
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 0) {
temp ++
} else if (temp !== 0) {
//否则,把当前数字放到最前面那个0的位置,然后再把
//当前位置设为0
nums[i - temp] = nums[i]
nums[i] = 0
}
}
return nums
};
只出现一次的数字
只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
异或法
这题说的是只有一个数出现了一次,其他数字都出现了2次,让我们求这个只出现一次的数字。这题使用位运算是最容易解决的,关于位运算有下面几个规律
- 1^1=0;
- 1^0=1;
- 0^1=1;
- 0^0=0;
也就说0和1异或的时候相同的异或结果为0,不同的异或结果为1,根据上面的规律我们得到
a^a=0;自己和自己异或等于0
a^0=a;任何数字和0异或还等于他自己
a^b^c=a^c^b;异或运算具有交换律
有了这3个规律,这题就很容易解了,我们只需要把所有的数字都异或一遍,最终的结果就是我们要求的那个数字。来看下代码
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let result = 0
for (let i = 0; i < nums.length; i++) {
result ^= nums[i]
}
return result
};
集合法
遍历数字,把每一项添加到集合中,如何已经存在了,则删除,最终只会剩下一个元素
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
const set = new Set()
nums.forEach(it => {
if (set.has(it)) {
set.delete(it)
return
}
set.add(it)
})
return [...set][0]
};