来一起刷简单算法题[六] 数组

116 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。

交换法

1.png

2.png

/**
 * @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
};

统计个数且交换法

3.png

4.png

/**
 * @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^1=0;
  2. 1^0=1;
  3. 0^1=1;
  4. 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]
};