Java刷题笔记(二)
一.简介
本系列是用来分享在洛谷,LeetCode的有趣的题目,使用Java编写且代码解释以注释为主。
本篇涉及:双指针,哈希表,原地交换
二.题目
1. 移动零
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
输入输出样例:
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
解法一:双指针
1 | //AC代码 |
双指针补充(来源:力扣题解):
2. 数组中的重复元素
题目描述:
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
输入输出样例:
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3]
输出: 2 或 3
提示:
2 <= n <= 100000
解法一:哈希表 / Set
1 | /** |
解法二:原地交换
题目说明尚未被充分使用,即 在一个长度为 n 的数组nums里的所有数字都在 0 ~ n-1 的范围内 。
此说明含义:数组元素的索引和值是一对多的关系。
因此,可遍历数组并通过交换操作,使元素的索引与值一一对应(即 nums[i] = inums[i]=i )。
因而,就能通过索引映射对应的值,起到与字典等价的作用。
遍历中,第一次遇到数字 xx 时,将其交换至索引 xx 处;而当第二次遇到数字 xx 时,一定有 nums[x] = xnums[x]=x ,此时即可得到一组重复数字。
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 magic-H!
评论