LeetCode283_283. ゼロの移動
1. 説明
配列 nums を指定して、ゼロ以外の要素の相対的な順序を維持しながら、すべての 0 を配列の末尾に移動する関数を作成します。
配列はコピーせずにその場で操作する必要があることに注意してください。
例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
例 2:
输入: nums = [0]
输出: [0]
ヒント:
1 <= nums.length <= 104
負の 2 の 31 乗 <= nums[i] <= 2 の 31 乗 - 1
2、解決策
方法 1: リストを使用する
//AC Your runtime beats 17.86 % of java submissions.
public void moveZeroes(int[] nums) {
//int[] nums1 = new int[nums.length];
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
list.add(nums[i]);
}
}
for (int i = 0; i < list.size(); i++) {
nums[i] = list.get(i);
}
for (int i = list.size(); i < nums.length; i++) {
nums[i] = 0;
}
//System.out.println(Arrays.toString(nums));
}
方法 2: ダブル ポインター
//方法二: 双指针
//先给非0数据依次放到数组左边,然后给剩余的位置的数据置为0
//AC 通过
public void moveZeroes2(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
//1、给非0数据往前挪
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[j] = nums[i];
j++;
}
}
//2、挪完了非0数据,后续的位置的数据都置为0
for (int i = j; i < nums.length; i++) {
nums[i] = 0;
}
}
方法 3: クイック ソートのアイデアを使用したダブル ポインターの最適化バージョン。
//方法三:优化版双指针,使用快排的思想。
//以0位分界点,给大于0的依次保持顺序挪到左边,右侧的直接置为0就行了。
//AC 通过
public void moveZeroes3(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
//1、给非0数据往前挪,然后给后面的位置置为0
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
int temp = nums[i];
nums[i] = 0;
nums[j] = temp;
j++;
}
}
}
LeetCode 217. 重複要素の存在
LeetCode 229. マジョリティ II
LeetCode 231. 2 の累乗LeetCode
234. 回文リンク リスト
LeetCode 237. リンク リスト内のノードの削除
LeetCode 242. 有効なアルファベット単語
LeetCode 257. バイナリ ツリー内のすべてのパス
LeetCode 258ビットの追加
LeetCode 263. 醜い数字
LeetCode 268. 欠落した数字
LeetCode 283. ゼロの移動
LeetCode 287. 重複の検索
免責事項:
トピックの著作権は元の作成者に属します。記事内のコードおよび関連する記述は私の理解に基づいて私が書いたものです、記事内の関連する写真は私が実践した際のスクリーンショットおよび関連技術に対応する写真です。異議がある場合は連絡して削除してください。ありがたい。転載は出典を明記してください、よろしくお願いします。
投稿者:luoyepiaoxue2014
ステーション B: https://space.bilibili.com/1523287361クリックしてリンクを開きます
Weibo: http://weibo.com/luoyepiaoxue2014クリックしてリンクを開きます