IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数组(array) -> 正文阅读

[数据结构与算法]数组(array)

1.1数组是一组元素的线性集合。

(1)类C的语法:

int a[] //定义一个元素类型是int的数组,名称是a

(2)Java中更推荐的写法:

int[] a ?//定义一个元素类型是int的数组,名称是a

注意:下标(index)从0开始

1.2元素类型[]:本身作为一种合法的数据类型,可以出现在任何需要数据类型的位置

long/String/Scanner/Random/boolean……[]

(1)定义变量 ?int[] a;

(2)定义方法时,可以出现在

?????返回值类型:public static int[] method{……}

?????形参列表:public static ?void ?main(String[] args){……}

(3)作为数组的元素类型使用

?????int[][]

?//定义了一个数组。数组的元素类型是int[](元素类型是int的数组) ?

2.数组的初始化(初始化不是赋值)

? int a={1,2,3,4}

(1)定义int类型的数组

(2)为其进行初始化操作——数组中共有4个元素,对应的下标为0,1,2,3

3.既可以用于初始化,也可以用于赋值

(1)已知元素时——可以根据后面的元素推导长度,不需要也不允许传长度

???int[] a=?new int[]{1,2,3,4}

(2)不知元素,但总长度已知

???int[] a=?new int[5]

?//定义了一个int数组,长度是5,这个5必须有,因为长度不变

如果:没有明确元素值得情况下,元素的默认值是什么?

每种变量都有其默认值(局部变量没有初始值)

实际上是0的变形值:

byte/short/int ?????0

long ???????????????0L

float ??????????????0.0F

double ????????????0.0

boolean ???????????false

char ??????????????0x0000对应的字符

引用类型 ??????????null*

4.关于数组类型的常见操作

(1)从数组中获取下标为i的元素(i>=0且<=数组长度)

int[] a={1,2,3,4};
int b=a[3];   //取a数组中下标为3的元素,类型是int

b==4

nt[] a=new int[5];
int b=a[3];   //取a数组中下标为3的元素,类型是int

b==0

如果下标没有在合法范围内(0<=i<数组长度),会有运行时异常:

IndexOutOfBoundsException(下标越界异常)——初期最常见的异常

?(2)获取数组的长度

???int[]a=……;? 唯一方法: a.length?

5.下标[]

作用(1):获取数组中某下标位置的元素——int b=a[i]; ????取

作用(2):修改数组中某下标位置的元素——a[i]=b; ????????设置

6.打印数组中的元素

java.util.Arrays类中有toString方法,方便直接打印数组

int[] a=……;

String s=Arrays.toString(a);

System.out.println(s);

代码练习:

  1. 从前往后遍历——用下标的角度i~[0,array.length]
    public class 代码练习1 {
        public static int indexOf(long[] array,long target){
                for (int i=0;i< array.length;i++) {
                    long element = array[i];
                    if (element == target) {
                        return i;
                    }
                }
                return -1;//超过合法下标,数组中没有找到target
        }
    }

    替换成带范围的后:

/替换成带范围的后[fromIndex,toIndex)
    public static int indexOf(long[] array,int fromIndex,int toIndex,long target){
        if (fromIndex<0||fromIndex>toIndex||toIndex>array.length){
            throw new RuntimeException("传入的参数不合法");
        }
        for (int i=fromIndex;i<toIndex;i++){
            if (array[i]==target){
                return i;
            }
        }
        return -1;
    }
}

?练习1测试:

public class 练习1测试 {
    public static void main(String[] args) {
        test1();
    }

    private static void test1() {
        long[] a1={1,2,3,4,5};
        System.out.println(代码练习1.indexOf(a1, 1));//0
        System.out.println(代码练习1.indexOf(a1, 5));//4
        System.out.println(代码练习1.indexOf(a1, -1));//-1
        System.out.println(代码练习1.indexOf(a1, 6));//-1
    }
}

?2.从后往前遍历

public class 代码练习2 {
    public static int lastIndexOf(long[] array,long target) {
        //从后往前找
        for (int i=array.length-1;i>=0;i--){
            long element=array[i];
            if (element==target){
                return  i;
            }
        }
        return -1;
    }
}

练习2测试:

public class 练习2测试 {
    public static void main(String[] args) {
        test2();

    }

    private static void test2() {
        long[] a1={1,2,3,4,3,2,1};
        System.out.println(代码练习2.lastIndexOf(a1,2,5,1));//-1
        System.out.println(代码练习2.lastIndexOf(a1,2,5,3));//4

    }
}

3.找到数组中的最大值

public class 代码练习3 {
    //不考虑数组长度为0的情况
    //new int[0];
    public static long max(long[] array){
        long max=array[0];
        for (int i=1;i<array.length;i++){
            if (array[i]>max){
                max=array[i];
            }
        }
        return max;
    }
}

4、计算数组中元素之和

public class 代码练习4 {
    //不考虑溢出的情况
    public static long sum(long[] array){
        long sum=0;
        for (long element:array){
            sum+=element;
        }
        return sum;
    }
}

替换成带范围的后:

//替换成带范围的后[fromIndex,toIndex)
    public static long sum(long[] array, int fromIndex, int toIndex) {
        long sum = 0;
        for (int i = fromIndex; i < toIndex; i++) {
            sum += array[i];
        }
        return sum;
    }
}

5、给定元素将其填充到数组中的每一个位置

public class 代码练习5 {
    public static void fill(long array[],long target){
        for (int i=0;i<array.length;i++){
            array[i]=target;
        }
    }
}

Java.util.Arrays类中的各种方法

  1. 学会常见的方法使用(尽量不要自己造)
  2. 学会查阅文档
import java.util.Arrays ;
public class 使用arrays中的方法 {
    public static void main(String[] args) {
        testBinarySearch();
    }

    private static void testBinarySearch() {
        long[] a={1,2,3,4,4,5,6,7,8,9};
        System.out.println(Arrays.binarySearch(a, 3));//2
        System.out.println(Arrays.binarySearch(a, 4));//3 OR 4
        System.out.println(Arrays.binarySearch(a, -1));//-1
        System.out.println(Arrays.binarySearch(a, 10));//-11非法下标
        
    }
}


  1. 传入数组返回数组对应的字符串形式
    public class MyArrays {
        //"[1,2,3,4]"
        public static String toString(long[] array){
            //遍历(下标遍历方式)
            String ans="[";
            //遍历除最后一个元素之外的其他所有元素
            for (int i=0;i<array.length-1;i++){
                long element=array[i];
                ans=ans+element+",";
            }
            //把最后一个元素添加到字符串ans中
            //数组中最后一个元素的下标是array.length-1
            //array.length的取值范围是>=0
            if (array.length>0){
                long lastElement=array[array.length-1];
                ans=ans+lastElement;
            }
            ans+="]";
            return ans;
        }
    }

    测试:

public class MyArraysTest {
    public static void main(String[] args) {
        test1();
    }
    private static void test1() {
        long[] arrays;
        String s;
        arrays=new long[0];
        s=MyArrays.toString(arrays);
        System.out.println(s);

        arrays=new long[5];
        s=MyArrays.toString(arrays);
        System.out.println(s);

        arrays=new long[]{1,2,3,4,5};
        s=MyArrays.toString(arrays);
        System.out.println(s);
    }

2.

public static long[] copyOf(long[] original,int newLength){
        long[] ans=new long[newLength];
        //下标i停留位置应该在original.length和ans.length中小的一个位置上
        int size=Integer.min(original.length,newLength);
        for (int i=0;i<size;i++){
            //需要保证=两边下标的合法性
            ans[i]=original[i];
        }
        //如果newLength>original.length了,ans中剩余的位置已经是long类型的默认值(0)
        return ans;
    }
}

测试:

private static void test2() {
    long[] original={1,2,3};
    long[] c1 = MyArrays.copyOf(original, 1);
    System.out.println(MyArrays.toString(c1));
    long[] c2 = MyArrays.copyOf(original, 3);
    System.out.println(MyArrays.toString(c2));
    long[] c3 = MyArrays.copyOf(original, 4);
    System.out.println(MyArrays.toString(c3));
}

3、

public static long[] copyOfRange(long[] original,int from,int to){
        if (from<0){
            throw new RuntimeException("from必须>=0");
        }
        if (from>0){
            throw new RuntimeException("from必须<=0");
        }
        if (from>original.length){
            throw new RuntimeException("from必须<=original.length");
        }
        int newLength=to-from;
        long[] ans=new long[newLength];
        /*假如i代表的是ans的下标,i的合法取值范围包含两个条件
        (1)i在ans中是合法下标[0,ans.length)
        (2)from+i在original中是合法下标[0,original.length)
            i的取值范围[-from,original.length-from)
         综上所述,i的合法范围是[0,ans.length)和[-from,original.length-from)的交集
         i~[0,min(ans.length,original.length-from)
         */
        int size=Integer.min(newLength,original.length-from);
        for (int i=0;i<size;i++){
            ans[i]=original[from+i]; 
        }
        return ans;
    }
}

测试:

private static void test3() {
    long[] original={1,2,3};
    long[] c1 = MyArrays.copyOfRange(original, 0, 0);
    System.out.println(MyArrays.toString(c1));
    long[] c2 = MyArrays.copyOfRange(original, 0, 2);
    System.out.println(MyArrays.toString(c2));
}

4、冒泡排序

public static void bubbleSort(long[] array){
    //
    for (int i=0;i<array.length-1;i++){
        /*每循环一次经过一次“冒泡过程”,把无序区间中的最大的数冒泡到无序区间的最后位置
        数组看做一个整体区间,表示[0,array.length)
        (1)无序区间:[0,array.length-i),实现具体的冒泡过程:
        j~[0,array.length-i)   j+1~[0,array.length-i)于是j~[-1,array.length-i-1)
        取交集为 j~[0,array.length-i-1)
         */
        for (int j=0;j<array.length-i-1;j++){
            //j需要保证array[j]和array[j+1]的下标的合法性
            if (array[j]>array[j+1]){
                //交换
                long t=array[j];
                array[j]=array[j+1];
                array[j+1]=t;
            }
        }
    }
}

测试:

private static void test4() {
    long[] array;
    array=new long[]{1,2,3,4,5,6};//有序情况
    MyArrays.bubbleSort(array);
    System.out.println(MyArrays.toString(array));

    array=new long[]{1,6,8,9,13,5};//无序情况
    MyArrays.bubbleSort(array);
    System.out.println(MyArrays.toString(array));

    array=new long[]{};//空序情况
    MyArrays.bubbleSort(array);
    System.out.println(MyArrays.toString(array));


}

5、二分法查找

public static int binarySearch(long[] array,long target){
    //待查找区间[low,high),待查找区间内元素个数为high-low;
    //定义待查找区间的下限
    int lowIndex=0;
    //定义待查找区间的上限
    int highIndex=array.length;
    //只要待查找区间中还有元素查找就要继续
    while (highIndex-lowIndex>0){
        int midIndex=(lowIndex+highIndex)/2; //暂时不考虑溢出情况
        long midElement=array[midIndex];
        if (target==midElement){
            return midIndex;
        }
        else if (target<midElement){
            //需要扔掉右边[MidIndex,……)
            //highIndex是开区间,虽等于但是区间内并没有midIndex的元素
            highIndex=midIndex;
        }else{
            //需要扔掉左边[……,MidIndex]
            //lowIndex是闭区间,所以等于midIndex+1,区间里没有midIndex对应的元素
            lowIndex=midIndex+1;
        }
    }
    //high-low<0换言之,待查找区间内一个元素都没有了,说明target不在array中
    return -1;
    }

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-28 12:10:13  更:2022-01-28 12:11:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:48:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码