ARTS 2023.8.28-2023.9.03 (第二周)

news2024/11/24 15:56:11

ARTS 2023.8.28-2023.9.03 (第二周)

💡ARTS:

A:至少每周完成一道Leecode的算法题;

R:阅读并点评至少一篇英文技术文章;

T:学习至少一个技术技巧;

S:分享一篇有观点和思考的技术文章;

Algorithm🤦‍♀️

题目:28.找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例 1:

输入:haystack = “sadbutsad”, needle = “sad” 输出:0 解释:“sad” 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = “leetcode”, needle = “leeto” 输出:-1 解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1 。

解题思路:

1.先获取needle 字符串的一个字符 A(任意字符,这里使用A来代替),然后在haystack 里遍历寻找出现A的位置i;然后在截取字符串i 到 i + needle .length() 的字符串与needle 比较,如果相等则i就是下标;

public static int strStr(String haystack, String needle) {
    if (haystack == null || needle == null || !haystack.contains(needle)) {
        return -1;
    }
    //记录needle的长度,方便后续在haystack进行截串
    int needleLength = needle.length();
    //获取要比较的第一个字符
    char needleFirst = needle.charAt(0);
    for (int i = 0, strLen = haystack.length(); i < strLen; i++) {
        char c = haystack.charAt(i);
        if(c == needleFirst){
            String substring = haystack.substring(i, needleLength + i);
            if(substring.equals(needle)){
                return i;
            }
        }
    }
    return -1;
}

上述代码复杂度为 m*n,以下KMP解法才是「原字符串」中找到「匹配字符串」的最佳解法;下面代码来自chatgpt所写。

KMP 解法 https://zh.wikipedia.org/wiki/KMP%E7%AE%97%E6%B3%95

KMP 算法是一个快速查找匹配串的算法,它的作用其实就是本题问题:如何快速在「原字符串」中找到「匹配字符串」。上述的朴素解法,不考虑剪枝的话复杂度是 O(m∗n) 的,而 KMP 算法的复杂度为 O(m+n)。

KMP 之所以能够在 O(m+n) 复杂度内完成查找,是因为其能在「非完全匹配」的过程中提取到有效信息进行复用,以减少「重复匹配」的消耗。

public static int strStr2(String haystack, String needle) {
    if (needle.isEmpty()) {
        return 0;
    }
    int[] next = computeNext(needle);
    int i = 0, j = 0;

    while (i < haystack.length()) {
        if (haystack.charAt(i) == needle.charAt(j)) {
            i++;
            j++;
            if (j == needle.length()) {
                return i - j;
            }
        } else {
            if (j > 0) {
                j = next[j - 1];
            } else {
                i++;
            }
        }
    }

    return -1;
}

private static int[] computeNext(String pattern) {
int[] next = new int[pattern.length()];
int i = 1, j = 0;

while (i < pattern.length()) {
    if (pattern.charAt(i) == pattern.charAt(j)) {
        j++;
        next[i] = j;
        i++;
    } else {
        if (j > 0) {
            j = next[j - 1];
        } else {
            next[i] = 0;
            i++;
        }
    }
}
return next;
}

Review📝

Basic Memory-Saving Techniques for Java Programming https://medium.com/javarevisited/basic-memory-saving-techniques-for-java-programming-6677a7237a69

1.本篇文章主要是举例子在Java在编写中减少内存开销的常用技巧,主要包括如下几个点:

  • 使用基础数据类型,而不是包装类; 减少对象创建内存开销

  • 避免创建不必要的对象;

    • Strings=“Hello” + " World"; // use StringBuilder instead
  • 使用懒加载模式 (use lazy initializetion), 减少在类加载时创建,在使用时候在创建;

  • 如果知道数据大小范围时使用数组来代替集合类 ; Use arrays instead of collections

  • 重复使用对象

    • List tempList = newArrayList<>();
      for (inti=0; i < 1000; i++) {
      tempList.add("Item " + i);
      // do something with tempList
      }
      tempList.clear(); // clear the list for reuse
      for (inti=0; i < 1000; i++) {
      tempList.add("Another item " + i);
      // do something with tempList
      }
  • 使用static工程方法来创建我们所需要的对象;

    • 例如: 使用工程方法创建一个指定大小的ArrayList, 这样可以减少添加元素时需要调整 ArrayList 大小的次数,从而节省内存。
  • 使用享元模式

  • 使用字符串的intern方法 Use the intern() method

  • 避免使用自动装箱;

    • inti=42;
      Integerj= Integer.valueOf(i); // use Integer.valueOf() instead of autoboxing

it is important to note that memory optimization should not come at the expense of code readability or maintainability. 值得注意的是,内存优化不应该牺牲代码的可读性与维护性为代价;

keep exploring, keep learning, keep coding.

Tip🐾

本周主要是学习Linux里的 dudf两个命令;

du 是 disk usage 的缩写,主要用于查看文件在磁盘中占用的空间大小;

df 是 disk free 的缩写,用于显示磁盘分区的可用和已用空间。它会列出系统中每个分区的总空间、已用空间和可用空间。

1.du的使用 du [opinions] [file]

  • du -h [-- human-readable] 人类可读的格式打印大小输出;
  • du -s [–summarize] 汇总显示大小

img

  • du -a:显示所有文件和目录的磁盘使用情况,包括隐藏文件。

2.df的使用 命令与du类似

  • df -h:以人类可读的格式显示磁盘使用情况。
  • df -h --total

img

Share🎨

  1. Java线程池的创建方式

在平时在Java开发中,我们创建线程池的方式有哪些呢? 通过 Executors工具类方法? 或者是自动new 一个出来呢? Executors工具类创建出来的线程池可能造成计算机资源内存不足的情况,因为它创建的任务队列是LinkedBlockingQueue() { this(Integer.MAX_VALUE); }MAX_VALUE的无尽队列,如果一直往队列里添加任务,而线程没有及时处理掉的话就会导致OOM;

我们在开发中都会使用 new ThreadPoolExecutor 方式进行创建线程池的;其中构造方法具有7大参数,也是面试常问的面试题;在这次分享中介绍一下这7个参数;

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
     
}
  1. corePoolSize 核心线程数
  2. maximunPoolSize 最大线程数 (核心线程数+x)
  3. keepAliveTime 线程空闲时间 核心线程数不会销毁,销毁的是非核心线程数
  4. unit 空闲单位
  5. workQueue 任务队列
  6. threadFactory 线程工厂 一般可以自定义线程名等
  7. handler 拒绝策略 任务拒绝策是当线程池无法接受新任务时应该采取的行动。当线程池的任务队列已满,并且线程池中的线程数已达到最大线程数时;

img

  • AbortPolicy 任务队列满了就报错
  • CallerRunsPolicy 调用者运行策略 当线程池的任务队列已满时,新提交的任务会由提交该任务的线程执行,而不是交给线程池中的线程来执行。
  • DiscardPolicy 丢弃策略
  • DiscardOldPolicy 线程池会丢弃队列中最早(最老)的任务,然后尝试将新提交的任务添加到队列中。

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

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

相关文章

【计算机基础知识4】网络通信协议:TCP、UDP、WebSockets

目录 一、TCP&#xff08;传输控制协议&#xff09; 1. TCP的特点 2. TCP的连接建立和终止 3. TCP的可靠性机制 4. TCP的流量控制 二、UDP&#xff08;用户数据报协议&#xff09; 1. UDP的特点 2. UDP的使用场景 三、WebSockets 1. WebSockets协议的特点 2. WebSock…

二分搜索树深度优先遍历(Java 实例代码)

目录 二分搜索树深度优先遍历 Java 实例代码 src/runoob/binary/Traverse.java 文件代码&#xff1a; 二分搜索树深度优先遍历 二分搜索树遍历分为两大类&#xff0c;深度优先遍历和层序遍历。 深度优先遍历分为三种&#xff1a;先序遍历&#xff08;preorder tree walk&am…

严选算法模型质量保障

在算法模型整个生命周期**&#xff08;算法模型生命周期&#xff1a;初始训练数据 --> 模型训练 --> 模型评估 --> 模型预估 --> 训练数据&#xff09;**中&#xff0c;任何环节的问题引入都可能导致算法模型质量问题。所以我们在做模型质量保障的过程中&#xff0…

【日常笔记】使用Server过程中可能遇到的一些问题

使用Server过程中可能遇到的一些问题 1. 如何查找GPU型号与驱动版本之间的关系&#xff1f;2. 如何查看当前Server的内核版本&#xff1f;3. 使用Nvidia过程中可能用到的命令4. 对Jupyter Notebook的一些配置5. TensorFlow的一般操作6. 使用PyTorch的一些操作7. 修改安装源为国…

【漏洞复现】网互联路由器存在密码泄露

漏洞描述 蜂网互联-让链接无限可能&#xff0c;灵活的多线分流&#xff0c;强大的策略分流&#xff0c;灵活调度各种软件应用&#xff0c;深度识别系统&#xff0c;各种应用一网打尽&#xff0c;灵活调整优先级&#xff0c;最简单的路由器&#xff0c;简洁易学的配置&#xff…

MySQL——多表查询

多表查询 多表查询的出现&#xff0c;是为了解决当我们的数据不能存放在一张表上&#xff0c;或者我们的数据本身就是存在多张表上&#xff0c;需要根据字段之间的关系&#xff0c;联合多张表查询出想要的数据。那么根据业务实现的关系&#xff0c;表与表之前也出现了三种基本…

构建微服务项目时启动网关服务失败的解决方案

启动网关服务时报“Unable to create the temporary folder: C:\WINDOWS\TEMP\/nio-file-upload”错误。 代码与之前没有任何变化&#xff0c;但就是启动不了&#xff0c;观察错误意思大概是不能创建临时文件夹&#xff1a;C盘下的WINDOWS下的TEMP目录下的nio-file-upload这个东…

C#,数值计算——多项式微分(Binomial Deviates)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 二项式偏差 /// Binomial Deviates /// </summary> public class Binomialdev : Ran { private double pp { get; set; } private double p…

day57 补

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…

机器学习——boosting之提升树

提升树和adaboost基本流程是相似的 我看到提升树的时候&#xff0c;懵了 这…跟adaboost有啥区别&#xff1f;&#xff1f;&#xff1f; 直到看到有个up主说了&#xff0c;我才稍微懂 相当于&#xff0c;我在adaboost里的弱分类器&#xff0c;换成CART决策树就好了呗&#xff1…

Yolov8-pose关键点检测:模型轻量化创新 | ​BiLevelRoutingAttention 动态稀疏注意力 | CVPR2023 BiFormer

💡💡💡本文解决什么问题:BiLevelRoutingAttention ,通过双层路由(bi-level routing)提出了一种新颖的动态稀疏注意力(dynamic sparse attention ) ​BiLevelRoutingAttention | GFLOPs从9.6降低至8.5,参数量从6482kb降低至6134kb, mAP50从0.921提升至0.926 Yolov8…

云备份服务端——实用类工具实现

一&#xff0c;文件实用类设计实现 不管是客户端还是服务端&#xff0c;文件的传输备份都涉及到文件的读写&#xff0c;包括数据管理信息的持久化也是如此&#xff0c;因此首先设计封装文件操作类&#xff0c;这个类封装完毕之后&#xff0c;则在任意模块中对文件进行操作时都将…

SLAM ORB-SLAM2(1)总体框架

SLAM ORB-SLAM2(1)总体框架 1. 简介2. 框架3. TRACKING4. LOCAL MAPPING5. LOOP CLOSING6. MAP1. 简介 ORB-SLAM2 是一个实时和完整的视觉SLAM系统(包括闭环检测、重定位、地图重用等功能) 提供了利用单目、双目以及RGB-D相机完成稀疏三维重建的功能和接口 2. 框架 总体来说…

c++day3

1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 #include <iostream>using namespace std; clas…

baichuan2(百川2)本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Vue3,Typescript中引用组件路径无法找到模块报错

是这么个事&#xff0c;我在vue3新创建的项目里&#xff0c;写了个组件叫headerIndex.vue&#xff0c;放到app.vue中import就会报错 路径肯定没写错&#xff0c;找到了解决方法&#xff0c;但是也没想明白为什么 解决方法如下 在vite-env.d.ts文件中加入 declare module &qu…

《向量数据库》——向量数据库Milvus 和大模型出联名款AI原生Milvus Cloud

大模型技术的发展正加速对千行百业的改革和重塑,向量数据库作为大模型的海量记忆体、云计算作为大模型的大算力平台,是大模型走向行业的基石。而电商行业因其高度的数字化程度,成为打磨大模型的绝佳“战场”。 在此背景下,Zilliz 联合亚马逊云科技举办的【向量数据库 X 云计…

Java类和对象(七千字详解!!!带你彻底理解类和对象)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象和面向过程 &#xff08;1&#xff09;传统洗衣服的过程 &#xff08;2&#xff09;现代洗衣服过程 ​编辑 二、类的定义和使用 1、类的定义格式 三、类的实例化 1、什么是实例化 2、类和对象说明 四、t…

【2023年11月第四版教材】第11章《成本管理》(合集篇)

第11章《成本管理》&#xff08;合集篇&#xff09; 1 章节说明2 管理基础3 管理过程3.1 管理ITTO汇总★★★ 4 规划成本管理4.1 成本管理计划★★★ 5 估算成本5.1 估算成本★★★ &#xff08;19上57&#xff09; &#xff08;19下35&#xff09;5.2 数据分析★★★5.4 成本估…

阿里云免费镜像仓库+金克斯+码云实现自动CI

前提 有阿里云账号&#xff0c;并且已经完成实名认证。最好有一台云服务器&#xff0c;以及码云账号&#xff0c;还有现成的项目以及Dockerfile一、开通阿里云容器镜像服务 1、新建命名空间(一般只需要建一个就行了) 2、在命名空间下&#xff0c;建立镜像仓库&#xff0c;看下…