【面试题】将一个无序整形数组的全部0移到末尾,并保持其它非0元素的相对顺序不变

问题描述: 将一个无序整形数组的全部0移到末尾,并保持其它非0元素的相对顺序不变。如:a={3,0,1,0,0,5,2,0,4,0},输出:{3,1,5,2,4,0,0,0,0,0}。
解决思路: 在Java中,一般数组是不可以直接增删元素的,可以转换成ArrayList再进行增删操作。而在Python中,可以将np.array数组转换成list,再进行增删操作。先逐个遍历数组元素,判断是否为0,为0则从ArrayList/list中移出,并用一个zero_list保存这些0,最后把两个列表合并。
Java代码如下:

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        int[] a = new int[]{3,0,1,0,0,5,2,0,4,0};
        System.out.print("原数组:");
        System.out.println(Arrays.toString(a));
        a = moveZeroToEnd(a);
        System.out.print("处理后的数组:");
        System.out.println(Arrays.toString(a));
    }

    public static int[] moveZeroToEnd(int[] arr) {
        // 将数组转换成list
        List<Integer> arr_list = Arrays.stream(arr).boxed().collect(Collectors.toList());
        List<Integer> zero_list = new ArrayList<>();
        for(int i = 0; i < arr_list.size();) {
            // 如果元素为0,则把它添加到zero,并把它从list中移出出来
            if(arr_list.get(i) == 0) {
                zero_list.add(0);
                arr_list.remove(i);

            }
            else { //否则,跳过,再判断下一个元素
                i++;
            }
        }
        arr_list.addAll(zero_list); //合并两个list
        // 将list转换成数组
        int[] res = arr_list.stream().mapToInt(Integer::valueOf).toArray();
        return res;
    }
}

执行结果:

原数组:[3, 0, 1, 0, 0, 5, 2, 0, 4, 0]
处理后的数组:[3, 1, 5, 2, 4, 0, 0, 0, 0, 0]

Python代码如下:

import numpy as np

def move_zero_to_end(arr):
    left_list = [] # 保存去掉0之后的list
    zero_list = [] # 保存提取出来的全为0的list
    for i in arr:
        if i == 0:
            zero_list.append(i)
        else:
            left_list.append(i)
    return np.array(left_list + zero_list)

a = np.array([3,0,1,0,0,5,2,0,4,0])
print('原数组:')
print(a)
after_arr = move_zero_to_end(a)
print('处理后的数组:')
print(after_arr)

执行结果:

原数组:[3 0 1 0 0 5 2 0 4 0]
处理后的数组:[3 1 5 2 4 0 0 0 0 0]

注意:Python中的数组是通过np.array定义的,而直接定义a = [3,0,1,0,0,5,2,0,4,0]是list,而不是数组。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章