剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 && 57. 和为s的两个数字

21题目描述:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

解析:

1.双指针法,定义一个数组res,然后定义左右指针left和right
2.遍历循环数组nums,当数组中的值为偶数时,数组res从指针right开始添加,然后right--
当数组中的值为奇数时,数组res从指针left开始添加,然后left++
3.最后返回数组res即可

Java:

public int[] exchange(int[] nums) {
        int[] res = new int[nums.length];
        int left = 0, right = nums.length - 1;
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] % 2 == 0) {
                res[right--] = nums[i];
            } else {
                res[left++] = nums[i];
            }
        }
        return res;
    }

JavaScript:

var exchange = function(nums) {
    let res = [];
    let left = 0, right = nums.length - 1;
    for(let i = 0; i < nums.length; i++) {
        if(nums[i] % 2 === 0) {
            res[right--] = nums[i];
        } else {
            res[left++] = nums[i];
        }
    }
    return res;
};

57题目描述:

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

解析:

1.双指针法,定义左右指针left和right,for循环遍历数组
2.如果nums数组左右指针所在的值加和小于target,则left++
如果nums数组左右指针所在的值加和大于target,则right--
如果nums数组左右指针所在的值加和等于target,则输出nums数组中左右指针所在的值
3.如果遍历完还没找到,则返回空数组

Java:

public int[] twoSum(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        for(int i = 0; i < nums.length; i++) {
            if(nums[left] + nums[right] < target) {
                left++;
            } else if(nums[left] + nums[right] > target) {
                right--;
            } else {
                return new int[] {nums[left], nums[right]};
            }
        }
        return new int[0];
    }

JavaScript:

var twoSum = function(nums, target) {
    let set = new Set();
    for(let i = 0; i < nums.length; i++) {
        if(!set.has(target - nums[i])) {
            set.add(nums[i]);
        } else {
            return [nums[i], target - nums[i]];
        }
    }
    return [];
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务