zoukankan      html  css  js  c++  java
  • 数组元素前移问题(今日头条笔试题)

    问题描述:给定一个整数数组和一个整数x,将数组中元素值为x的元素都放到数组的前面,其他元素的相对顺次不变。

                  例如:原数组为{4,0,1,0,2,,3,6,0,5},x=0,则调整后的数组为{0,0,0,4,1,2,3,6,5}

    分析:该问题存在多种解法。

              解法一:辅助数组法。创建一个和原数组一样长度的数组,从原数组的尾部开始扫描,如果元素值是x,则忽略。

                        否则,将元素拷贝到新数组的末尾。扫描完原数组后,再在新数组未重新赋值的元素全部赋值为x。

                        最后再将新数组的所有元素赋值到原数组中。

                        假设原数组的长度为n,则算法的空间复杂度为O(n),时间复杂度为O(n).

              解法二:和解法一有点类似,设置一个指针 j 用来存储元素值为x的下标,初始设置j为数组最后元素的下标,然后从尾部开始扫描,

                         如果元素不是x,如果j所指元素为x,则交换两个元素的值,最后j--,如果元素是x,则忽略本次循环。

                         该方法不需要额外的辅助空间,空间复杂度为O(1),时间复杂度为O(n).

        由于解法一比较简单,我就不再写具体的代码了,这里我给出解法二的Java代码实现。

     1 import java.util.*;
     2 public class Main {
     3     public static void adjust(int a[],int x){
     4         int i,j=a.length-1;                       //j为元素值为x的下标 
     5         for(i=a.length-1;i>=0;i--)
     6         {
     7             if(a[i]!=x)
     8             {
     9                 if(a[j]==x)
    10                 {
    11                     int t=a[i];                   //交换两个元素的位置
    12                     a[i]=a[j];
    13                     a[j]=t;
    14                 }
    15                 j--;
    16             }
    17         }
    18     }
    19     
    20     public static void main(String[] args) {
    21         // TODO 自动生成的方法存根
    22         Scanner scan=new Scanner(System.in);
    23         int a[]={4,0,1,0,2,3,6,0,5};
    24         for(int i=0;i<a.length;i++)
    25         {
    26             System.out.print(a[i]+",");
    27         }
    28         System.out.println();
    29         System.out.print("请输入要提前的元素值:");
    30         int x=scan.nextInt();
    31         adjust(a,x);
    32         for(int i=0;i<a.length;i++)
    33         {
    34             System.out.print(a[i]+",");
    35         }
    36         
    37 
    38     }
    39 
    40 }

    测试样例输出为:

    4,0,1,0,2,3,6,0,5,
    请输入要提前的元素值:0
    0,0,0,4,1,2,3,6,5,

    举一反三:该题目是前移,同样会有后移,读者可以自己尝试编程实现。

  • 相关阅读:
    Python操作Excel表格
    Python爬虫实战:爬取美食节川菜信息
    超级实用的Python网络爬虫反反爬策略之构造UA池及IP代理池
    Python 静态方法
    IDEA连接远程服务器Docker部署Spring Boot项目
    Dockerfile 解析
    Python爬虫实战-统计博客园阅读量问题
    Docker 容器数据卷
    Docker镜像
    PL/SQL
  • 原文地址:https://www.cnblogs.com/guozhenqiang/p/5471049.html
Copyright © 2011-2022 走看看