首页 > 编程语言 >Java 数组操作:反转、扩容与缩容

Java 数组操作:反转、扩容与缩容

时间:2024-11-14 20:16:58浏览次数:3  
标签:缩容 arr Java int 元素 length 数组 oldArr

在 Java 中,数组是一种固定长度的数据结构,一旦创建,其大小无法更改。然而,常常在实际编程中,我们需要对数组进行扩容、缩容或其他操作。本文将介绍如何通过 Java 实现数组反转、扩容和缩容的操作,并在代码中演示这些常见的数组操作。

1. 数组反转

数组反转是一个常见的操作,通常用于将数组中的元素顺序颠倒。下面是两种常见的实现方法:

方法 1:利用临时变量交换元素

这种方法通过交换数组的对称元素来实现反转。基本思路是用一个临时变量交换数组两端的元素,然后逐渐向数组的中心靠拢。

public static void main(String[] args) {
        //数组反转01
        int[] arr = new int[]{1, 2, 3, 4, 5};
        System.out.println("反转之前");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        //法1
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;

        }
        System.out.println();
        System.out.println("反转之后");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
解析:
  • 在 for 循环中,i 从数组的开始位置逐渐向数组的中间移动。每次通过临时变量 temp 交换当前元素和对称元素的位置。
  • 这种方法的时间复杂度是 O(n/2),即 O(n),其中 n 是数组的长度。
方法 2:使用双指针法

双指针法利用两个指针分别指向数组的左右两端,然后交换它们所指向的元素,并且逐渐向中间靠拢,直到两个指针相遇。

public static void main(String[] args) {
        //数组反转01
        int[] arr = new int[]{1, 2, 3, 4, 5};
        //法2
        for (int left = 0, right = arr.length - 1; left < right; left++, right--) {
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
        System.out.println();
        System.out.println("反转之后");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }

    }

解析:
  • left 指针从数组的开始位置,right 指针从数组的末尾位置,两个指针逐步向中间移动。
  • 每次交换 left 和 right 所指向的元素,直到 left 和 right 相遇或交错。

测试结果

反转之前
1	2	3	4	5	
法1
反转之后
5	4	3	2	1	
法2
反转之后
1	2	3	4	5

2. 数组扩容

Java 数组一旦初始化,长度是固定的。如果需要动态扩容,可以创建一个新的数组,并将原数组的元素复制到新数组中。假设我们需要为原数组扩容 3 个位置,并将新元素添加到新数组中。


   //数组的扩容,给老数组加上3个值
    public void enlarge() {
        int[] oldArr = new int[]{1, 2, 3, 4, 5};
        int[] newArr = new int[oldArr.length + 3];
        for (int i = 0; i < oldArr.length; i++) {
            newArr[i] = oldArr[i];
        }
        newArr[oldArr.length] = 10;
        newArr[oldArr.length + 1] = 20;
        newArr[oldArr.length + 2] = 30;
        oldArr = newArr;
        System.out.println("扩容之后");
        for (int i = 0; i < oldArr.length; i++) {
            System.out.print(oldArr[i] + "\t");
        }

    }

 测试结果:

扩容之后
1	2	3	4	5	10	20	30
解析:
  • 首先创建一个比原数组大的新数组 newArr
  • 使用 for 循环将 oldArr 中的所有元素复制到 newArr 中。
  • 添加新的元素 102030
  • 扩容后的数组就变成了 newArr,并将其赋值给 oldArr

3. 数组缩容

数组缩容通常发生在需要删除数组元素时。例如,删除数组中索引为 2 的元素,我们需要将后面的元素向前移动一位,并将数组的最后一个元素置为 0。

//数组缩容
    //删除数组中索引为2的元素
    public void shrink() {
        int[] oldArr = new int[]{1, 2, 3, 4, 5};
        int index = 2;
        for (int i = index; i < oldArr.length - 1; i++) {
            oldArr[i] = oldArr[i + 1];
        }
        oldArr[oldArr.length - 1] = 0;
        System.out.println("缩容之后");
        for (int i = 0; i < oldArr.length; i++) {
            System.out.print(oldArr[i] + "\t");
        }
    }

测试结果: 

缩容之后
1	2	4	5	0	

 解析:

  • 我们需要删除 index 处的元素。通过将后面元素前移一位,覆盖被删除元素。
  • 最后,将数组最后一位元素赋值为 0,避免出现残留数据。
  • 缩容后的数组包含删除指定元素后的结果。

总结

在 Java 中,数组是一种固定大小的容器,无法动态调整大小。为了满足不同需求,我们可以通过以下几种方式处理数组:

  1. 数组反转:可以使用交换法或双指针法实现数组的反转。
  2. 数组扩容:当数组需要添加更多元素时,可以创建一个新的数组并将原数组的内容复制到新数组中。
  3. 数组缩容:通过删除指定索引的元素并向前移动元素实现数组的缩容。

这些操作不仅是 Java 编程中常见的技术,也是解决实际问题时常用的手段。理解并掌握这些数组操作,可以帮助开发者编写更灵活、实用的代码。

标签:缩容,arr,Java,int,元素,length,数组,oldArr
From: https://blog.csdn.net/2402_85834817/article/details/143779248

相关文章

  • Java常见排序算法详解:快速排序、插入排序与冒泡排序
    在程序设计中,排序是最基本的操作之一。Java提供了多种排序算法,今天我们将介绍三种常见的排序方法:快速排序、插入排序和冒泡排序。我们不仅会分析它们的基本原理,还会提供实际的代码实现,帮助大家更好地理解并应用这些排序算法。一、快速排序(QuickSort)快速排序是一种分治法的排......
  • java 反序列化 cc3 复现
    版本要求:jdk版本<=8u65,common-collections版本<=3.2.1在很多时候,Runtime会被黑名单禁用.在这些情况下,我们需要去构造自定义的类加载器来加载自定义的字节码.类加载机制双亲委派这里直接粘别人的了.实现一个自定义类加载器需要继承ClassLoader,同时覆盖findClass方法......
  • java 反序列化 cc4 复现
    复现环境:jdk<=8u65,commonsCollections=4.0CommonsCollections4.x版本移除了InvokerTransformer类不再继承Serializable,导致无法序列化.但是提供了TransformingComparator为CommonsCollections3.x所没有的,又带来了新的反序列化危险.cc4的执行命令部分依然沿用cc3的TemplatesI......
  • [原创]手把手教学之前端0基础到就业——day11( Javascript )
    文章目录day11(Javascript)01Javascript①Javascript是什么②JavaScript组成③Javascript的书写位置1.行内式(不推荐)2.内部位置使用(内嵌式)3.外部位置使用(外链式)02变量1.什么是变量2.定义变量及赋值3.注意事项4.命名规范03输入和输出1)输出形式1......
  • java API
     API(ApplicationProgrammingInterface)是指应用程序的编程接口。字符串类Java中定义了3个封装字符串的类,分别是String类、StringBuffer类、StringBuilder类,它们位于Java.lang包中,并提供了一系列操作字符串的方法,这些方法不需要导包就可以直接使用。1.1String的初始化......
  • python+vue基于django/flask新农村综合风貌展示平台java+nodejs+php-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • 代码随想录算法训练营第一天| 704. 二分查找、35.搜索插入位置、27. 移除元素、977.有
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题一、数组理论基础数组:连续内存空间,存储类型相同的元素集合,适合读不适合写注意:Python里可以存储不同类型的元素,但刷题时都是按照相同元素去做的相同元素占用存储的空间大小是一样的,下一个元素的位置就确定了数组时间......
  • 代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II
    文档讲解:代码随想录视频讲解:代码随想录状态:完成2道题滑动窗口滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题适用场景:字符串匹配问题、子数组问题、定长问题滑动窗口模板:如果一个字符进入窗口,应该增加windows计数器;如果一个字符将移除窗口的......
  • java的算法-余弦相似度
    背景:做过财务系统的小伙伴们都知道,财务系统会有一个自动计费的算法,这个算法依赖于计费模板,之前的同事呢把计费公式乱写(导致很多重复的公式),虽然计费名称不一样但是计费公式却是一样的,今天就写一个算法来计算公式代码之间的相似度publicstaticvoidmain(String[]args){......
  • java学习记录06
    正则表达式匹配规则对于正则表达式来说,它只能精确匹配字符串。例如:正则表达式“abc",只能匹配”abc",不能匹配“ab","Abc","abcd"等其他字符串。如果想匹配非ASCII字符,例如中文,那么就用\u####的十六进制表示,例如:a\u548cc匹配的是字符串"a和c",中文字符和的Unicode编码是548c......