自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 【Java】多线程基础操作

这实际上是编译器的优化机制导致的. 众所周知, CPU 从内存中读取数据是一个开销较大的工作, 那么我们这个循环处于一直执行的状态, 并且速度极快, 但是如果一直从内存中读取数据就会极大的降低程序的运行效率. 那么此时编译器就会检测, 假如它检测到你的这个标志位似乎是不变的, 那么此时编译器就会从内存中复制一份标志位的拷贝到 CPU 的寄存器中, 此时 CPU 从寄存器中读取数据就快很多, 就会起到优化的效果.此时我们可以在出去绿色区域的时候直接把锁释放掉吗?

2024-09-27 14:55:03 885

原创 【Java】反射, 枚举, Lambda

Lambda 表达式是一个用于简化函数式接口的语法而设置的一个语法糖, 语法糖顾名思义, 语法上吃起来甜甜的东西, 实际指的就是一系例简化后的语法. 例如我们之前使用过的 for-each 循环, 就是简化了遍历数组或者集合这样的语法而设置的一种语法糖.那此时可能有人就要问了: 既然 Lambda 表达式是为了简化函数式接口设置的语法糖, 那函数式接口又是什么呢?实际上, 当我们的接口中, 有且仅有一个抽象方法的时候, 那么这个接口就可以被称作是函数式接口. 例如下面这个接口就是一个函数式接口。

2024-09-23 20:37:36 941

原创 【Java】多线程前置知识 & 初识Thread

既然提到了 CPU, 那么就不得不提到另外一个话题, 就是多核 CPU 的诞生. 在过去, 这些 CPU 都是只有单个核心的(核心就可以理解为是一个能够完成一些运算功能的集合体, 里面由很多运算器组成, 完成指令执行, 简易运算操作). 在最开始的时候, 都是通过提高 CPU 内部电路的集成程度, 去提高 CPU 的运行速度. 随着集成程度的提高, 那么此时自然那些运算单元就也需要去变得更小, 但是小到一定程度之后, 那么此时进一步去缩小难度就会比较高了.

2024-09-19 19:02:46 1166

原创 【计算机网络】HTTP&HTTPS

实际上是因为, HTTP 协议是一种"一问一答"结构模型的协议, 因此请求和响应是需要有一些不同的. 不然我问啥你答啥这不就乱套了吗。为什么要这个属性呢?实际上是因为在过去, 浏览器的功能是比较有限的, 但是随着时代的发展, 有一些浏览器就支持了一些新的功能, 此时网站的设计者也就可以跟随时代潮流更新自己的网站. 但是有一个问题, 假如使用旧版本的浏览器访问新版本网页的话, 就会出现兼容性问题. 因此这个属性就可以帮助网站的设计者去区分谁用的是什么样的浏览器, 然后针对它们使用的浏览器来进行特定的响应.

2024-09-14 16:23:26 1587

原创 【计算机网络】IP, 以太网, ARP, DNS

IP 地址, 本质上是一个 32 位的整数, 但是为了方便人来理解, 采用了点分十进制来表示这个地址上面也说过IP地址是用来区分各个设备的, 因此理论上来说, 这个IP地址是不应该重复的, 但是从IP地址的大小来看, 我们也知道, IP 地址只能表示 2 的 32 次方个数字. 实际上在当初设计这个IP地址的时候, 这个数字是绰绰有余的, 但是随着互联网的高速发展, 如今要使用网络的设备, 早就超过了这个数字.那么要如何解决这个 IP 地址不够用的问题呢?实际上有两个方案动态分配 IP。

2024-09-12 20:43:59 1266 1

原创 【计算机网络】初识网络

例如公司中, 假如人数很多, 那么就会实现分层管理, 每当要发配任务的时候, 员工给自己的上司汇报, 然后上司再给上层的领导进行汇报, 反之同理. 这样就能显著提高管理效率, 降低管理成本

2024-09-12 11:56:54 1656

原创 【计算机网络】UDP & TCP介绍

可以看到, 此时李四后面回的消息, 反而先到达了, 此时就可能会产生歧义, 张三此时就会想: 这李四居然不想和我吃饭, 而是想转我一百万, 真是我的好兄弟啊. 但是实际上并不是这样的

2024-09-09 18:43:19 994

原创 【双指针】N数之和

解决了第一个点, 接下来就是第二个点, 去重. 这里有一个非常简单的方法就是使用自带的集合类去去重, 比如Java中的HashSet. 但是我们这里就不使用这种方法了, 而是使用手动的方式来实现.那么此时我们就可以在过程中, 当当前数字和上一个数字不同的时候, 存储数字, 如果当前数字和上一个数字相同, 那么就跳过这些相同的数字. 但是这里要注意的是, 无论是选择。双指针优化和三数之和的思路一致, 先找一个数, 在后方区间求三数之和, 然后三数之和的思路就和前面一样, 那么总结下来的流程如下。

2024-09-08 21:38:44 983

原创 【MySQL】索引和事物

在正常情况下, 数据库去搜索数据, 都是通过一行行的遍历, 然后找到符合要求的行并且筛选出来, 很明显这样的操作对于查询频繁的表来说, 效率是非常低的. 同时我们的数据库都是将数据存储在硬盘上的, 而每一次访问硬盘的操作, 开销是非常大的, 因此更不用说频繁的访问硬盘了.因此为了优化查询操作, 数据库添加了索引机制, 索引是针对于查询操作的一种特殊的优化手段, 它主要是通过一些数据结构去给表中的数据进行管理, 从而便于查找.

2024-09-08 21:14:52 1314

原创 【MySQL】MySQL操作介绍

MySQL 是一个用于存储大量数据的数据库管理软件, 一般我们也会直接叫这种软件为数据库. 它主要的功能就是能够将大量的数据有组织的存储起来, 便于我们增删查改, 从而实现一些涉及到大量数据的业务逻辑. 目前, 我们就只需要知道, MySQL 他就是用于把数据有组织的存储起来的, 能够支持我们进行对数据进行增删查改, 那么就足够了.

2024-09-08 21:09:24 2573

原创 【滑动窗口】将 x 减到 0 的最小操作数

当然也是没有必要的, 因为你要求区间里面的和至少要 target. 你刚刚区间, 就恰好是 >= target 的边界. 也就是说, 左边的值应该都是 <= target 的, 也就是下面这个图蓝色区间的和, 肯定是小于 target 的. 因为是正好加了右侧指针的值才 >= target 停下的。更新结果: 结果的更新, 可以说是最好写的一个部分, 你要什么, 你就在什么时候更新. 我们要的是 sum = target 的长度, 那我们就在 sum = target 的时候更新长度不就行了?

2024-09-03 21:49:34 1164

原创 【链表】环形链表

而此时我们回到 fast 走两步, slow走一步的情况, 我们可以发现, 在这种情况中, fast 相对于 slow, 总是在以 1 步的相对速度逐渐靠近的(fast 走两步, slow 走一步, 相对速度 = fast - slow, 即一步). 而同时我们长度的最低计量单位就是 1 步, 那么此时自然就不可能会发生直接越过 slow 的情况了。假设我们的 slow 能够走一圈, 那么此时 fast 的速度既然是 slow 的两倍, 那它理论上都走完了两圈了, 怎么可能会追不上 slow 呢?

2024-09-03 21:38:13 1219

原创 【Java & 数据结构】二叉搜索树 & TreeMap 和 TreeSet 介绍

很明显, 对于二叉搜索树来说, 如果它树的分布是对半分布的, 如下图左侧的二叉树所示. 那么此时在查找过程中每经过一个节点都会排除一半的元素, 类似于二分查找, 因此理想情况下查找的时间复杂度是 O(logN). 但是如果是最坏情况, 二叉搜索树会是一棵单叉树, 如右图所示, 那么此时每一次都只能排除一个节点, 此时查找的时间复杂度就是 O(N) 了。

2024-08-29 15:37:57 913

原创 【Java & 数据结构】HashMap和HashSet介绍

Map 和 Set 是 Java 集合框架中的两个接口, 其分别对应着两种不同的搜索模型. 其中 一个是纯 key 模型, 另一个则是 key-value 模型.纯 key 模型就类似于一个集合, 里面装载着一些元素, 这些元素只包含其本身. 例如我有一个冰箱, 里面装着各式各样的饮料, 那么此时这个冰箱就可以看作是一个饮料的集合, 里面装载着饮料. 此时如果我要在里面找饮料, 找的就是饮料本身.

2024-08-29 13:33:23 1094

原创 【Java & 数据结构】排序

这里我们简单总结一下各个排序的性质, 其中取的时间复杂度和空间复杂度都是平均情况排序方法时间复杂度空间复杂度稳定性冒泡排序O(N^2)O(1)稳定选择排序O(N^2)O(1)不稳定插入排序O(N^2)O(1)稳定希尔排序O(1)不稳定堆排序O(NlogN)O(1)不稳定快速排序O(NlogN)O(logN)不稳定归并排序O(NlogN)O(N)稳定。

2024-08-20 19:44:20 443

原创 【Java & 数据结构】PriorityQueue介绍

上一次我们简单的了解了二叉树这个数据结构, 但是在学习过后难免会产生一个问题就是, 二叉树的这个结构到底有什么用呢?那么接下来我们就来介绍一个集合类 PriorityQueue, 翻译过来就是优先级队列, 它能够将内部的元素进行优先级的排列, 从而使得每一次的出队都能够是优先级最高的元素. 它的底层就是一个使用顺序存储的完全二叉树结构, 而这种结构也有一个新的名字, 它就叫做堆.上面我们也说过, 堆是一个顺序存储的完全二叉树, 但是它的特征不仅仅于此, 他还有一些还有其他的性质. 下面是一个关于堆的描述自然

2024-08-20 19:44:04 1010

原创 【Java & 数据结构】初识二叉树

树是一种非线性的数据结构, 也就是说它和我们前面学习的顺序表链表之类的不太一样. 那些数据结构要求中间的元素都只有一个前驱和后继, 而树型结构的中间元素则允许有多个后继.例如下面这个就是一个树形结构为什么叫这种结构为树形结构呢?这是因为它的结构长的就像一颗倒过来的树, 最上面是树根, 最下面则是叶子.下面我们看几个例子, 来认识一下树形结构的注意点下面的这个结构, 就不是一个树形结构, 原因是其中间在同一层的节点, 是不可以相连的, 中间的节点只允许和上层节点和下层节点进行连接.

2024-08-20 19:30:24 744

原创 【二叉树】最近公共祖先

此时我们可以会想到我们最开始的分析, 我们是如何分析出最近公共祖先的位置的呢?实际上是不可能的, 因为我们的返回值是 p 和 q 的存在情况, 当我们确认公共祖先后, 证明 p 和 q 一定在刚刚那个公共祖先的位置以及它的下面, 你往上递归, 是不可能遇到其他的 p 和 q 的存在情况的.如果没有传递过来 q 的位置信息, 此时就能够充分的证明, 这个 q 一定在我的下面, 而不是在我的对面. 因为如果出现在对面, 我一定是可以在上面的某个节点处获取到的. 这个间接的排除也是非常的巧妙的.

2024-08-17 09:00:00 703

原创 【Java & 数据结构】Stack和Queue介绍

我们上面的实现是以数组/顺序表的形式模拟实现的栈, 同时 Java 提供的 Stack类也是基于这种方式实现的, 那么此时可能有人想了, 我能否基于链表的结构来实现一个栈呢?答案是当然是可行的, 但是对于不同种类的链表, 其效率也会有所不同, 例如我假如使用了一个单链表来维护一个栈. 那么很明显, 入栈和出栈既可以在链表头实现, 也可以在链表尾实现, 但是效率有所不同.

2024-08-15 09:00:00 697

原创 【Java & 数据结构】LinkedList介绍

回答这个问题前, 首先我们需要了解一下这个头节点是干什么的. 这个头节点实际上和寻常的节点没有什么两样, 但是它的数据域, 是不存储真正的数据的, 你可以在这个数据域中存储任意的数据, 例如存储链表的长度, 或者根本不使用这个数据域都是可以的. 它的作用就是用于作为链表的头, 便于链表的操作和管理而设计的.首先我们要想这个节点和链表是什么关系?很明显如果要插入一定要前一个位置的引用, 因为要令其 next 指向当前节点, 因此我们需要找到前一个节点. 那么我们如何找到前一个节点呢?

2024-08-14 09:00:00 1266

原创 【Java & 数据结构】ArrayList类介绍

实际上这样确实解决了有效元素个数和数组长度不匹配的问题, 但是随之迎来的新问题就是, 这样做的效率是非常低的. 我们如果要对数组扩容, 就需要新开辟一个空间, 然后将原来的数组复制过去, 那么如果我进行一次插入就要进行一次这样的开辟空间和复制数组的操作, 对于一些数据量大并且频繁插入的情境下, 很明显就是非常低效的.然后是一个打印顺序表的方法, 这个方法主要是方便我们去查看顺序表的具体变化, 这里需要注意的是, 不能通过直接遍历整个数组的方式去进行打印, 因为数组大小不一定等于有效数据的个数。

2024-07-20 17:41:53 768 1

原创 【Java】集合类, 包装类和泛型

集合框架, 其包含了Java提供的一些接口和类. 这些类实现了一些常见的数据结构, 从而使得我们可以简单的进行一些常见的数据操作.但是, 这并不说明我们只需要会用集合框架中的这些类即可. 我们需要了解其背后的数据结构, 也就是其底层的原理, 同时了解一些它们的具体代码, 从而帮助我们了解各个集合类的优缺点, 从而在对应的场景下选择出最合适的集合类进行使用.下面是一个集合框架的简单关系图.但是在学习这些集合类前, 我们还需要对一些基础内容进行介绍, 防止我们到时候需要阅读源码时看不懂一些内容.在很多时候, 我

2024-05-12 22:16:46 887 1

原创 【Java】图书管理系统

可能有人觉得这个操作很多余,但是假设这个程序只是一个大程序的一个小分支,小分支的结束并不代表整个程序的结束,那么此时我们如果不进行清理的话就可能会导致内存的泄露(也就是程序占用着内存,但是我们由于操作不当,导致我们无法对这块内存进行操作,那么这块内存就是被无效占用的,这样的情况就被称作内存泄露)。方法的时候都尽可能的不要把一坨代码全部塞在一起,因为假如有一些功能是可以共享的,比如我们的删除和修改都可以利用查找功能,我们就可以借助查找里面的代码,而不用去重新写,但是如果全部塞在一起就不好重复利用了。

2023-05-31 20:17:12 1937

原创 【Java】异常

上面说过,异常实际上也是类,那么我们也可以通过自己写一些异常类来自定义一些异常定义异常类的语法如下public class 类名 extends RuntimeException {//定义运行时异常 } public class 类名 extends Exception {//定义编译时异常 }创建完后我们再通过IDEA添加三个构造方法} }其中第一个构造方法接收错误信息,在抛出异常的时候会打印出异常信息。

2023-05-20 22:08:22 179

原创 【Java】String类介绍

StringString,也就是字符串,就是字符char的集合。这个时候可能有人会想,既然String是字符的集合,那为什么还要一个类去描述这个集合呢?实际上,String类并不止定义了char类型的集合,并且提供了很多操作String的方法。其实其他基本类型也有对应的类,例如int double就分别有Integer和Double,这种类被称为包装类,我们在之后数据结构前置章节详细说明,我们现在先了解即可String用于比较字符串的大小,定义如下为要比较的字符串>0,当前字符串大于=0。

2023-05-19 16:01:47 478

原创 【Java】接口和内部类

可以发现,倘若我们克隆对象的类中,成员里有一个引用类型,如果这时我们直接将这个对象里面的内容进行克隆,对于引用类型来说我们克隆的也就是地址而已,而这个对象内部引用指向的内容我们并没有进行克隆。但是由于抽象类的本质就是类,也是可以描述对象的。我们上面讲到内部类的静态成员,由于静态成员都是属于类的,因此静态内部类是属于外部类的,里面的静态变量是属于静态内部类的,那么这样我们甚至可以在外部类对象不存在的时候就直接访问。接口是一个空接口,也被称作标记接口,它的内部没有任何方法,就如它的定义一样,是一个空的接口。

2023-05-12 15:29:01 626

原创 【Java】多态

多态多态的概念多态的实现向上转型方法的重写动态绑定向下转型重载和重写的区别多态的优缺点优点缺点抽象类抽象类语法抽象类特性抽象类的作用多态的概念多态,顾名思义,就是一种事物多种形态,那么用面向对象的思想来解释多态思想的话,就是一个对象可以有不同的形态从而能够在执行相同操作的时候达到不同的结果。通过一个现实的例子来说:打印机这个对象,它可以有两种形态:彩色打印机和黑白打印机,当他们执行打印操作的时候,结果就分别为彩色打印和黑白打印多态的实现那么如何在Java中实现多态呢?如果要想在Java中实现多态需

2023-05-04 12:36:36 254 1

原创 【Java】继承

在我们创建对象的时候,我们会发现某一些对象也存在一些共同点,那么这个时候如果这样的对象一多,代码的冗余度就会比较高。传参,否则就无法构造一个带有继承的对象。可以看到,父类一定是先构造完才会构造子类的,那么理由实际上也很简单:由子类创建的对象,是继承着父类的属性的,所以在创建的时候一定会先构造父类的成员,然后再进行子类的构造。那么这个时候如果我想要细分,就比如我要细分出一个猫咪类和一个狗狗类,那么我就只需要继承这个类的属性,然后给新的类加上猫和狗独有的属性(比如叫声)就行。以这个例子来说,我们在。

2023-04-28 18:03:27 135

原创 【Java】类和对象

上面我们说,面向对象思想解决问题是通过对象间的交互来实现的。那么我们如何去告诉Java有哪些对象呢?我们就要通过定义类来去描述对象,主要是描述对象的各种属性,行为等等。那么定义的语法如下field;// 字段(属性) 或者 成员变量(实例变量) method;// 行为 或者 成员方法 }其中field代表着属性(有些地方也叫字段),对于Java来说就是一些变量,这些变量被称做成员变量(实例变量)。而method代表着行为,对于Java来说就是一些方法,这些方法被称作成员方法。而ClassName。

2023-04-24 22:27:53 117

原创 【C语言】寻找两个只出现一次的数字

这里就产生了一个新的问题,如何将这些数字进行分组,并且能保证两个数字被分在不同的组里面。这里就要借助异或的性质,我们知道,如果这两个数不同,那么异或是肯定会产生一个新的数字,而这个数字的二进制位中,会表现出这两个数不同的位置,那么我们就可以通过这一点来对这些数字进行分组。那么可以看出,这两个数字后三位都是不同的,那么此时我们只要选任意一位不同位,就可以进行分组,并且3和4肯定不会被分在一起。如果是直接全部数字异或,那么我们得到的数字就是两个单独的数字异或出的结果,很显然这个方法不太行。

2023-04-22 18:27:54 261

原创 【Java】数组

数组,是相同类型的集合,允许在里面存储同类型的多个元素,那么我们在存储多个同类型元素的时候,就不用创建一堆变量了,而是可以用一个数组将他们存储在一起那么如何创建一个数组?Java中提供了三种方式来创建数组数据类型 [ ] 数组名 = new 数据类型 [ 数组的大小 ];数据类型 [ ] 数组名 = new 数据类型 [ ] {要存储的数据 };数据类型 [ ] 数组名 = {要存储的数据 };那么是什么意思呢?我们以一个实例来帮助理解} }创建一个大小为5的数组,并且将这五个数据初始化为。

2023-04-21 17:59:02 131

原创 【C语言】排序妙找多数元素

给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

2023-04-18 15:43:44 81

原创 【Java】方法

方法就像一个工具,可以完成特定的功能,Java中也预制了很多的方法,例如我们上一节中的nextLine()这样的后面加括号的,都是方法。实际上,我们也可以自定义一些方法来帮我们完成特定的功能,同时还能减少代码的冗余度,因为我们只要写一次就可以多次的调用这个方法。那么要怎么样才能定义方法呢?语法如下关于标识符,我们现在的学习阶段,统一写成就可以,到后面的类和对象章节详细解释那么其他的是什么意思呢?我们通过一个例子来帮忙解释,下面定义一个求两个整型和的方法intintvoid。

2023-04-17 15:51:04 66

原创 【C语言】初识动态规划和运用

由于这是第一次介绍动态规划思想,所以我们先简单的介绍一下这个思想,如果只想想看解题思路可以直接看后面的动态规划解题部分动态规划的思想是将问题分解为一系列子问题,然后将每个子问题的解存储起来,以便以后需要时能够快速的访问和使用。通过这种方式,动态规划可以在不重复计算子问题的情况下,更有效地求解原问题。那么是什么意思呢?举一个超级简单的例子,我们怎么只用1和加法算2和3。那要是最直接的算:算3就是1+1+12又等于1+1,那么就要用三次加号。但假如我们用动态规划的思想,我们就先将基础情况设为1。

2023-04-16 22:48:26 250

原创 【Java】流程控制

学过了选择结构和循环结构后,我们往往就会遇到一些需要接收数据和输出数据的题目,所以这里简单介绍一下Java中的输入和输出如何操作。,但是还是建议养成良好的书写习惯,平常也可以多用用这个快捷键来看看格式化后的代码和自己的代码有什么区别,学习一下规范的写法。在我们每一次调用读取类型的方法的时候,假如我们后面还要读取数据,就在读取类型的那一次读取后面加一次空读取,把换行拿走。在使用循环结构的时候,我们一般要在循环语句里面对布尔表达式涉及到的量进行调整,从而控制循环执行的次数。

2023-04-16 00:44:12 64

原创 【Java】操作符

上一节我们有谈到过数据的存储,我们得知整型数据在内存中存储的是补码,所以涉及到二进制位的操作符都是操作补码。但是操作符的优先级多而杂,不推荐记忆,推荐在表达式中适当的加上括号保证运算符合我们的要求即可。操作符是有优先级的,如果表达式比较复杂,那么表达式可能就不会按照我们预想的方式进行运算。千万不能和上面一样直接写,只能一个一个的判断,并且结合下面的逻辑操作符把他们连起来。这里就顺便提一下16进制和2进制的关系,2进制的4个位相当于16进制的1个位。类型的时候,就会变为逻辑操作符,但是它们不会进行短路运算。

2023-04-15 17:56:53 225

原创 【Java】详解数据类型

变量,指可以改变的量,和常量类似,每一种数据类型都有其对应的变量,那么我们要如何定义一个变量呢?意义变量的语法如下数据类型 变量名称 = 变量初始值;//例如 int a = 0;在之前,我们输出类似于HelloWorld这样的字符串的时候,是要加上双引号的"",而倘若我们想要输出变量的内容,则直接将变量放到输出语句里就行int a = 0;} }那么我们要怎么样改变一个变量呢?实际上我们只要将一个常量直接赋值给变量就行int a = 0;a = 10;

2023-04-15 14:43:06 132

原创 【Java】注释,关键字,标识符

throws:用于描述方法可能抛出的异常类型和说明。@see:用于描述引用其他类、方法或变量的链接。@deprecated:用于标记已过时的方法或类。这些需要我们在学习深入中慢慢了解,因就不再过多阐述了。

2023-04-15 14:40:23 158

原创 【Java】初识Java

首先我们随便找一个地方,创建一个文本文件,然后将它的后缀改为.java但是一定要记得先把显示文件扩展名打开后按照上面的格式改才有用然后我们就可以写出我们的第一个Java程序这里有几个注意点那么这段代码大概是什么意思呢,我们稍微的进行一些了解,但是不用死究,这些在后续的深入学习中会逐渐解释清楚首先,我们先看最外层的内容这里是声明一个类,这个类此时类名一定要和文件名相同然后再往里看这段代码是声明了一个方法,名字是mainmain声明这个main方法的格式是固定的最后再看看剩下的最后一串代码。

2023-04-13 16:44:10 71

原创 【C语言】字符个数统计

字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。最后,就是统计字符出现的种类数了,我们就从第一个开始,和后面的一个字符进行比较就行,如果发现不相等,就让我们的计数器自增。这题与其说是字符个数统计,不如说是字符种类统计,就好比我给你一串数组,要你找出里面有几个数字出现了一次一样。然后就是写一个比较大小的函数,由于字符的本质是整型,所以实际上我们直接返回两个字符的差值即可。例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3。

2023-04-12 21:44:16 1385

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除