数据结构的魅力

news2024/11/22 16:55:22

数据结构这块越学越敬佩 博大精深

统计大文件中相同年龄的人的个数

public static void main(String[] args) throws Exception {
        String str = "";
        String fileName = "";
        InputStreamReader isr = new InputStreamReader(
                new FileInputStream(fileName), StandardCharsets.UTF_8);
        long start = System.currentTimeMillis();
        BufferedReader br = new BufferedReader(isr);
        int tot = 0;
        int[] data = new int[200];
        while ((str = br.readLine()) != null) {
            int age = Integer.parseInt(str);
            //巧用下标
            data[age]++;
            tot++;
        }
        System.out.println("总共数据大小" + tot);
        for (int i = 0; i < 200; i++) {
            System.out.println(i + ":" + data[i]);
        }
        System.out.println("花费时间" + (System.currentTimeMillis() - start) + "ms");
    }
private static final int DEFAULT_SIZE = 10;
	private Object data[];
	private int index;
	private int size;

	public MyArrayList() {
		this.data = new Object[DEFAULT_SIZE];
		this.size = DEFAULT_SIZE;
	}

	@Override
	public void add(E e) {
		data[index++] = e;
		if (index == size) { // ����
			this.size = this.size * 2 + 1;
			Object newData[] = new Object[this.size];
			for (int i = 0; i < data.length; i++) {
				newData[i] = data[i];
			}
			this.data = newData;
		}
	}

	@Override
	public void remove(int i) {
		if (i >= 0 && i < index) {
			for (int j = i; j < this.data.length - 1; j++) {
				data[j] = data[j + 1];
			}
			this.index--;
		}
	}

	@Override
	public E get(int i) {
		if (i >= 0 && i < index) {
			return (E) this.data[i];
		}
		return null;
	}

	@Override
	public int size() {
		return index;
	}

	@Override
	public boolean isEmpty() {
		if(index <= 0) return true;
		return false;
	}
	@Override
	public void remove(Object e) {
		if(!isEmpty()) {
			for(int i = 0 ; i < this.data.length ; i ++) {
				if(data[i].equals(e)) {
					remove(i);
					break;
				}
			}
		}
	}

 

 private int size;
    private int data[];
    private int index;

    public ArrayTest(int size) {
        index = 0;
        this.size = size;
        data = new int[size];
    }

    public void print() {
        System.out.println("index" + index);
        for (int i = 0; i < index; i++) {
            System.out.println(data[i] + "");
        }
        System.out.println();
    }

    public void insert(int loc, int n) {
        if (index++ < size) {
            for (int i = size - 1; i > loc; i--) {
                data[i] = data[i - 1];//数据后移
            }
            data[loc] = n;
        } else {

        }
    }

    public void delete(int loc) {
        for (int i = loc; i < size; i++) {
            if (i != size - 1) {
                data[i] = data[i + 1];
            } else {
                data[i] = -1;
            }
        }
        index--;
    }
public class MyLinkedList {

    private ListNode head;
    private int size = 0;

    public void insertHead(int data) {
        ListNode newNode = new ListNode(data);
        //先把后面的连上 再连前面的 重要! 先从尾开始,链表先从pre前开始
        newNode.next = head;
        head = newNode;
    }

    public void insertNth(int data, int position) {
        if (position == 0) {
            insertHead(data);
        } else {
            ListNode cur = head;
            //找到位置先
            for (int i = 1; i < position; i++) {
                cur = cur.next;
            }
            ListNode newNode = new ListNode(data);
            //猎杀时刻!
            newNode.next = cur.next;
            cur.next = newNode;
        }
    }

    public void deleteHead() {
        head = head.next;
    }

    public void deleteNth(int position) {
        if (position == 0) {
            deleteHead();
        } else {
            ListNode cur = head;
            for (int i = 1; i < position; i++) {
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
    }

    public void find(int data){
        ListNode cur = head;
        while (cur !=null){
            if(cur.value==data) break;
            cur = cur.next;
        }
    }

}

class ListNode {
    int value;
    ListNode next;

    ListNode(int value) {
        this.value = value;
        this.next = null;
    }
}
/**
 * //LRU
 *  //遍历,找到 删除 插入头部,最新
 *  //不在 有空间 插入头部 没有空间 删除最后一个
 */

public class DoubleLinkList {		// 双向链表

    private DNode head;		//头
    private DNode tail;		// 尾

    DoubleLinkList(){
        head = null;
        tail = null;
    }

    public void insertHead(int data){
        DNode newNode = new DNode(data);
        if(head == null){
            tail = newNode;
        }else{
            head.pre = newNode;
            newNode.next = head;
        }
        head = newNode;
    }
    public void deleteHead(){
        if(head == null) return ;		//没有数据
        if(head.next == null){		//就一个点
            tail = null;
        }else{
            head.next.pre = null;
        }
        head = head.next;
    }
    public void deleteKey(int data){
        DNode current = head;
        while (current.value != data) {
            if (current.next == null) {
                System.out.println("没找到节点");
                return ;
            }
            current = current.next;
        }
        if (current == head) {// 指向下个就表示删除第一个
            deleteHead();
        } else {
            current.pre.next = current.next;
            if(current == tail){		//删除的是尾部
                tail = current.pre;
                current.pre = null;
            }else{
                current.next.pre = current.pre;
            }
        }
    }
}

class DNode{

    int value;		//值
    DNode next;		//下一个的指针
    DNode pre;		//指向的是前一个指针

    DNode(int value){
        this.value = value;
        this.next = null;
        this.pre = null;
    }
}
public class ArrayStack<Item> implements MyStack<Item> {

    private int num = 0;
    private Item[] items = (Item[]) new Object[1];

    @Override
    public MyStack<Item> push(Item item) {
        judgeSize();
        items[num++] = item;
        return null;
    }

    public ArrayStack(int cap) {
        items = (Item[]) new Object[cap];
    }

    private void judgeSize() {
        if (items.length <= num) {
            resize(2 * items.length);
        } else if (num > 0 && num <= items.length / 2) {
            resize(items.length / 2);
        }
    }

    private void resize(int size) {
        Item[] temp = (Item[]) new Object[size];
        for (int i = 0; i < num; i++) {
            temp[i] = items[i];
        }
        items = temp;
    }

    @Override
    public Item pop() {
        if (isEmpty()) {
            return null;
        }
        Item item = items[--num];
        items[num] = null;
        return item;
    }

    @Override
    public int size() {
        return num;
    }

    @Override
    public boolean isEmpty() {
        return num == 0;
    }

}

/**
* [{({([({})])})}] 是否对称
**/
  public static boolean isOK(String s) {
        MyStack<Character> brackets = new ArrayStack<Character>(20);
        char c[] = s.toCharArray();
        Character top;
        for (char x : c) {
            switch (x) {
                case '{':
                case '(':
                case '[':
                    brackets.push(x);
                    break;
                case '}':
                    top = brackets.pop();
                    if (top != null && top == '{') {
                        break;
                    } else {
                        return false;
                    }
                case ')':
                    top = brackets.pop();
                    if (top != null && top == '(') {
                        break;
                    } else {
                        return false;
                    }
                case ']':
                    top = brackets.pop();
                    if (top != null && top == '[') {
                        break;
                    } else {
                        return false;
                    }
                default:
                    break;
            }
        }
        //进出对称 最后没有元素 都pop了
        return brackets.isEmpty();
    }

 


public class ArrayQueue {

    private final int[] data;//数据
    private int head;//头
    private int tail;//尾
    private int n = 0;//大小

    public ArrayQueue(int cap) {
        data = new int[cap];
        n = cap;
    }

    /**
     * 入队列
     *
     * @param m
     */
    public void push(int m) {
        if (tail == n)
            //满了
            return;
        data[tail] = m;
        tail++;
    }

    /**
     * 出队列
     *
     * @return
     */
    public int pop() {
        if (isEmpty()) return -1;
        int m = data[head];
        head++;
        return m;
    }

    public boolean isEmpty() {
        return head == tail;
    }

}
//循环
public class CircleArrayQueue {

    private final int[] data;//数据
    private int head;//头
    private int tail;//尾
    private int n = 0;//大小

    public CircleArrayQueue(int cap) {
        data = new int[cap];
        n = cap;
    }

    /**
     * 入队列
     *
     * @param m
     */
    public void push(int m) {
        if ((tail + 1) % n == head)
            //满了,头尾相连
            return;
        data[tail] = m;//尾插
        tail = (tail + 1) % n;//后移
    }

    /**
     * 出队列
     *
     * @return
     */
    public int pop() {
        if (isEmpty()) return -1;
        int m = data[head];
        head = (head + 1) % n;
        return m;
    }

    /**
     * 首尾重叠
     *
     * @return
     */
    public boolean isEmpty() {
        return head == tail;
    }

}

数据同步架构参考 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1590367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSCP靶场--Banzai

OSCP靶场–Banzai 考点(ftp爆破 webshell上传web1访问403web2可以访问webshell反弹mysql udf提权) 1.nmap扫描 ## nmap扫描一定要使用 -p- 否则容易扫不全端口 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.158.56 -Pn -p- --min-rate 2500Starting Nmap 7.…

ArcGIS Pro 3D建模简明教程

在本文中&#xff0c;我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互&#xff08;即使是专门用于 3D 建模的软件&#xff09;&#xff0c;并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段&#xff1a;…

AI绘本生成解决方案,快速生成高质量的AI绘本视频

美摄科技凭借其深厚的技术积累和前瞻性的市场洞察力&#xff0c;近日推出了一款面向企业的AI绘本生成解决方案&#xff0c;旨在通过智能化、自动化的方式&#xff0c;帮助企业快速将文字内容转化为生动有趣的绘本视频&#xff0c;从而提升内容传播效率&#xff0c;增强品牌影响…

迁移docker部署的GitLab

目录 1. 背景2. 参考3. 环境4. 过程4.1 查看原docker启动命令4.2 打包挂载目录传至新宿主机并创建对应目录4.3 保存镜像并传至新宿主机下4.4 新宿主机启动GitLab容器 5 故障5.1 容器不断重启5.2 权限拒绝5.3 容器内错误日志 6 重启容器服务正常7 总结 1. 背景 最近接到一个任务…

Python的标准输入输出及强制类型转换

Python标准输入 input()是Python提供的标准输入函数&#xff0c;括号内为显示在终端的提示信息&#xff0c;其返回结果为字符型&#xff08;str&#xff09;。 Python标准输出 print()是Python提供的标准输出函数&#xff0c;可以将括号中的内容输出到终端中。 print()函数中有…

五、书架开发--2.书架图书列表实现

组件涉及动态组件应用 下面我们先来继续编写书架列表吧即ShelfList.vue书架的数据我们之前就已经获取到了&#xff0c;通过引入mixin即可。 for循环书架数据展示一堆item(图书列表中的方框) 我们要实现图书列表的图书数据显然应该用v-for循环来循环每个方框的图书&#xff0…

实战解析:SpringBoot AOP与Redis结合实现延时双删功能

目录 一、业务场景 1、此时存在的问题 2、解决方案 3、为何要延时500毫秒&#xff1f; 4、为何要两次删除缓存&#xff1f; 二、代码实践 1、引入Redis和SpringBoot AOP依赖 2、编写自定义aop注解和切面 3、application.yml 4、user.sql脚本 5、UserController 6、U…

计算机网络——TCP和UDP协议

目录 前言 前篇 引言 TCP与UDP之间的区别 TCP 三次握手 为什么要三次握手而不是两次握手&#xff1f; 丢包问题与乱序问题的解决 四次挥手 为什么客户端需要等待超时时间&#xff1f; UDP协议 TCP和UDP的主要区别 前言 本博客是博主用于复习计算机网络的博客&…

【Jenkins】Jenkins自动化工具介绍

目录 技术背景常规的手动打包步骤 Jenkins简介起源与发展Jenkins的核心价值1.自动化1.1代码构建1.2测试自动化1.3自动部署 2.持续集成与持续部署CI/CD的概念如何减少集成问题更快速地发布软件版本 Jenkins优势Jenkins的主要竞争对手Travis CI:CircleCI:GitLab CI: Jenkins与其他…

阿里云9元服务器租用收费价格表_免费云服务器领取

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

出海企业如何从海外云手机中受益?

随着全球化的推进&#xff0c;越来越多的企业开始将目光投向海外市场。然而&#xff0c;不同国家和地区的网络环境、政策限制&#xff0c;以及语言文化的差异&#xff0c;给出海企业的市场拓展带来了诸多挑战。在这一背景下&#xff0c;海外云手机作为一种新兴解决方案&#xf…

等保测评2.0——网络安全等级保护测评的初步了解

一、什么是网络安全等级保护测评&#xff1f; 二、网络安全等级保护&#xff0c;保护的是什么&#xff1f; 等级保护对象&#xff1a;网络安全等级保护工作直接作用的对象。&#xff08;注&#xff1a;主要包括信息系统、通信网络设施和数据资源等&#xff09; 计算机信息系统…

设计模式代码实战-抽象工厂模式

1、问题描述 小明家新开了两个工厂用来生产家具&#xff0c;一个生产现代风格的沙发和椅子&#xff0c;一个生产古典风格的沙发和椅子&#xff0c;现在工厂收到了一笔订单&#xff0c;请你帮他设计一个系统&#xff0c;描述订单需要生产家具的信息。 输入试例&#xff1a; 3 …

【设计模式】六大设计原则

设计原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的六大设计原则零、单一职责原则开闭原则里氏代换原则依赖倒置原则接口隔离原则迪米特法则合成复用原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的 设计模式有23种&#xff0c;我认为对普通人来说想…

【Python】读取时间判定操作次数问题和一些解决办法

几种类 datetime.striptime() 计算两个字符串之间的时间差 datetime.striptime()计算两个字符串之间的时间差 datatime类提供函数处理日期和时间 Striptime()分析字符串值以固定格式表示时间然后存储为函数参数 输出就是&#xff1a; time.sleep() time模块打印时间按照对…

python--递归算法篇

1、给定一个包含n1个整数的数组nums&#xff0c;其数字在1到n之间&#xff08;包含1和n&#xff09;&#xff0c; 可知至少存在一个重复的整数&#xff0c;假设只有一个重复的整数&#xff0c;请找出这个重复的数 def repeat(ls:list) -> list:#把个数超过1的数&#xff0c…

AutoCAD 2024 安装注册教程

前言 大家好&#xff0c;我是梁国庆。 本篇分享的安装包是 AutoCAD 的全新版本——AutoCAD 2024&#xff0c;下文安装教程中简称 AutoCAD。 时间&#xff1a;2024年4月8日。 获取 AutoCAD 安装包 我已将本篇所使用的安装包打包上传至百度云&#xff0c;扫描下方二维码关注…

014:vue3 van-list van-pull-refresh实现上拉加载,下拉刷新

文章目录 1. 实现上拉加载&#xff0c;下拉刷新效果2. van-list&#xff0c;van-pull-refresh组件详解2.1 van-list组件2.2 van-pull-refresh组件 3. 完整案例4. 坑点&#xff1a;加载页面会一直调用加载接口 1. 实现上拉加载&#xff0c;下拉刷新效果 通过下拉刷新加载下一页…

DMA的认识

DMA介绍 Q:什么是DMA&#xff1f; DMA( Direct Memory Access&#xff0c;直接存储器访问 ) 提供在 外设与内存 、 存储器和存储器 、 外设 与外设 之间的 高速数据传输 使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于 CPU &#xff0c;在这个时间中&am…

Matlab与ROS(1/2)---Message(三)

0. 简介 消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。为了标识其数据结构&#xff0c;每条消息都有一个消息类型。例如&#xff0c;来自激光扫描仪的传感器数据通常以sensor_msgs/LaserScan类型的消息发送。每种消息类型标识消息中包含的数据元素。…