一起学算法(顺序表篇)

本文详细介绍了顺序表在Java中的实现,包括数组存储、添加、插入、删除、遍历、查找和修改等操作,以及相关示例和动画演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:

1.顺序表的定义

       用一段地址连续的存储单元依次存储数据的线性表被称为数据表,在Java中顺序表一般是数组或者是ArrayList实现的

先把代码放这里,接下来一一给大家进行讲解:

public class SeqList {
    private Object[] data;  // 用数组存储元素
    private int size;       // 当前元素个数

    public SeqList(int capacity) {
        data = new Object[capacity];
        size = 0;
    }

    // 在末尾添加元素
    public void add(Object element) {
        if (size >= data.length) {
            // 扩容
            Object[] newData = new Object[data.length * 2];
            System.arraycopy(data, 0, newData, 0, data.length);
            data = newData;
        }
        data[size] = element;
        size++;
    }

    // 在指定位置插入元素
    public void insert(int index, Object element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index out of range");
        }
        if (size >= data.length) {
            // 扩容
            Object[] newData = new Object[data.length * 2];
            System.arraycopy(data, 0, newData, 0, index);
            System.arraycopy(data, index, newData, index + 1, size - index);
            data = newData;
        } else {
            System.arraycopy(data, index, data, index + 1, size - index);
        }
        data[index] = element;
        size++;
    }

    // 删除指定位置的元素
    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of range");
        }
        System.arraycopy(data, index + 1, data, index, size - index - 1);
        size--;
        data[size] = null;  // 将最后一个元素置为 null,方便垃圾回收
    }

    // 获取指定位置的元素
    public Object get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of range");
        }
        return data[index];
    }

    //给定target,返回其索引
    public int findIndex(int target){
        int index=-1;
        for(int i=0;i<data.length;i++){
              if(data[i]==target){
                   index=i;
}
          }
      return index;
     }

    // 获取顺序表的大小
    public int size() {
        return size;
    }

    // 判断顺序表是否为空
    public boolean isEmpty() {
        return size == 0;
    }
}

2.顺序表的遍历

1.遍历的含义

对顺序表的元素进行一次访问的过程被称为遍历

2.动画演示

 黄色代表第一个被遍历的元素,紫色代表已经遍历的元素,红色代表正在遍历的元素

3.代码实现

public void traversal(int[] num){
    for(int i=0;i<num.length;i++){
         //获取对应索引上的元素值
         int m=num[i];
}
}

3.顺序表的调试

1.调试的含义

调试的含义就是通过一些可视化的方式将顺序表打印出来,利用遍历的方式就可以实现

2.动画演示

 3.代码实现

 public static void main(String[] args) {
         int[] num={2,5,6,4,9,6};
         for(int i=0;i<num.length;i++){
             System.out.print(num[i]);
         }
    }

4.顺序表元素的索引

1.索引的含义

顺序表的索引就是给定一个下标i,通过下标进行数据访问的过程

2.动画演示

 黄色的部分就代表这个顺序表的第6个元素,因为索引是从0开始的,所以num[5]就可以取到这个值

3.代码实现

   // 获取指定位置的元素
    public Object get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of range");
        }
        return data[index];
    }

由于顺序表元素存储在连续的内存空间中,所以通过下标进行访问,其中[i]代表了第i+1个元素,调用时需要注意i的取值,必须为非负整数且小于数组的最大长度,查找的时间复杂度是O(1)

5.顺序表元素的查找

1.插入的含义

给定的一个位置k和插入的元素,将它插到顺序表的第k个位置上,并且将后面的元素依次往后移动

2.动画演示

 插入元素必然导致顺序表元素的后移,最后将需要插入的元素赋值给对应位置的元素

3.代码实现

    // 在指定位置插入元素
    public void insert(int index, Object element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index out of range");
        }
        if (size >= data.length) {
            // 扩容
            Object[] newData = new Object[data.length * 2];
            System.arraycopy(data, 0, newData, 0, index);
            System.arraycopy(data, index, newData, index + 1, size - index);
            data = newData;
        } else {
            System.arraycopy(data, index, data, index + 1, size - index);
        }
        data[index] = element;
        size++;
    }

       如果索引越界直接抛出异常,如果数组已经没有空余位置,直接进行扩容,如果原数组中还有空余的位置,对原数组的index~最后 移动到index+1~最后,将索引index对应的位置空出来,然后将插入元素填入index位置上,这就完成了插入操作

6.顺序表元素的删除

1.删除的含义

给定一个位置k,代表需要删除的元素,将它进行删除,并且将后面的元素往前移动

2.动画演示

 3.代码实现

    // 删除指定位置的元素
    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of range");
        }
        System.arraycopy(data, index + 1, data, index, size - index - 1);//左闭又开
        size--;
        data[size] = null;  // 将最后一个元素置为 null,方便垃圾回收
    }

7.顺序表的查找

1.查找的含义

通过遍历顺序表找到和给定data相等的元素并返回它的下标

2.动画的演示

 3.代码实现

  //给定target,返回其索引
    public int findIndex(int target){
        int index=-1;
        for(int i=0;i<data.length;i++){
              if(data[i]==target){
                   index=i;
}
          }
      return index;
     }

8.顺序表的修改

1.修改的含义

通过查找到顺序表的下标并对给定位置的元素进行修改

2.动画演示

 3.代码实现

public void update(int i,int val){
     data[i]=val;
}

leetcode题单:

拿硬币

class Solution {
      public int minCount(int[] coins) {
     if(coins==null||coins.length==0){
         return 0;
     }
     int count=0;
        for (int i = 0; i <coins.length; i++) {
            count+=(coins[i]&1)==0?(coins[i]/2):((coins[i]/2)+1);
        }
        return count;
    }
}

K个元素的最大和

class Solution {
    public int maximizeSum(int[] nums, int k) {
       if(nums==null||nums.length==0){
           return 0;
       }
       int ans=0;
       //执行k次循环
       while(k!=0){
         //保存最大值的下标
         int maxIndex=0;
         for(int i=0;i<nums.length;i++){
             if(nums[i]>nums[maxIndex]){
                 maxIndex=i;        
                      }
         }
          ans+=nums[maxIndex];
        nums[maxIndex]+=1;
         k--;
       }
       return ans;
    }
}

数组元素和与数字和的绝对差

class Solution {
    public int differenceOfSum(int[] nums) {
     int sum=Arrays.stream(nums).sum();
     int sum1=0;
       for(int item:nums){
           int n=item/10;
           if(n==0){
               sum1+=item;
               continue;
           }
           if(n>0){
               while(item!=0){
                   sum1+=item%10;
                   item=item/10;
               }
           }
       }
       return Math.abs(sum-sum1);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃橘子的Crow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值