
数据结构与算法
文章平均质量分 52
记录一些数据结构学习体会与算法心得
我有明珠一颗
一条通往业界大神的成功之路
展开
-
Java数组(知识点总结)
数组是多个相同类型数据按一定顺序排列的集合,使用一个名字命名,通过编号的方式来对这些数据进行统一管理。数组是引用数据类型,数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。数组一旦初始化,长度就确定了,数组长度一旦确定不可修改。原创 2023-11-14 13:12:06 · 175 阅读 · 0 评论 -
HJ26 字符串排序
Character.isLetter(char c) 方法可判断字符是否为字母,相当于判断(c>='a'&& c='A'&& c (char)c)可以转化为字符型;filter() 表示过滤,这里将所有大小写字母过滤出来原创 2023-11-10 14:05:34 · 179 阅读 · 0 评论 -
HJ23 删除字符串中出现次数最少的字符
将字符串中的字符通过 Stream 和 lambda表达式 加入到 HashMap 中,记录每个字符的个数;通过 Collections.min() 方法找到 map 中最小值对应的 value值;通过Stream的filter方法过滤掉数量最少的元素,mapToObj将类型转化为char,最后无换行输出。原创 2023-11-10 13:26:02 · 115 阅读 · 0 评论 -
HJ20 密码验证合格程序
str.chars() 获取字符流,通过流的 filter 方法可以简单地过滤出符合要求的字符。".*(.{3,}).*\\1.*" 表示匹配长度 >=3 的重复子字符串。这里的 .* 表示任意长度(>=0)的字符串,中间夹杂了 "(.{3,})" 和 "\\1",(.{3,})表示匹配任意长度>=3的字符串,\\1 表示匹配与前面(.{3,})一样的字符串,所以 ".*(.{3,}).*\\1.*" 表示匹配长度 >=3 的重复子字符串。原创 2023-11-09 19:24:16 · 179 阅读 · 1 评论 -
华为机试练习题:HJ35 蛇形矩阵
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。输入正整数N(N不大于100)输出一个N行的蛇形矩阵。原创 2023-11-09 15:21:39 · 118 阅读 · 0 评论 -
Java8.0 Stream、lambda表达式练习(持续更新中)
Java8.0 Stream、lambda表达式练习。原创 2023-11-09 00:37:05 · 389 阅读 · 0 评论 -
华为机试练习题:HJ51 输出单向链表中倒数第k个结点
Java实现:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。原创 2023-11-08 13:23:41 · 139 阅读 · 0 评论 -
华为机试练习题:HJ9 提取不重复的整数
String类型的contains()方法,可以判断字符串中是否有子字符串。String类型的substring(int beginIndex, int endIndex) 根据指定的起始位置和终止位置,截取字符串。原创 2023-11-08 12:40:28 · 128 阅读 · 0 评论 -
华为机试练习题:HJ8 合并表记录
TreeMap 可以自动升序排序,输出符合测试用例如果结果不讲究排序,则可以用 HashMap使用Lambda表达式可简化集合的输出代码,不必再写for循环原创 2023-11-08 12:17:52 · 111 阅读 · 0 评论 -
华为机试练习题:HJ15 求int型正整数在内存中存储时1的个数
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。数据范围:保证在 32 位整型数字范围内。这个数转换成2进制后,输出1的个数。原创 2023-11-07 18:15:46 · 134 阅读 · 0 评论 -
华为机试练习题:HJ14 字符串排序
Arrays.sort() 可以对各种类型的数组进行排序操作。原创 2023-11-07 18:05:39 · 145 阅读 · 0 评论 -
华为机试练习题:HJ13 句子逆序
trim() 方法:去除字符串首尾的空格;split() 方法:按照指定分隔符来把字符串且分为字符串数组,默认分隔符为空格;采用 StringBuilder 类来操作有长度变化需求的字符串,可提升效率。原创 2023-11-07 17:56:31 · 99 阅读 · 0 评论 -
华为机试练习题:HJ11 数字颠倒
String 一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。而 StringBuffer 和 StringBuilder 类使用 append 和 insert 等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。因此:当需要进行频繁修改字符串的操作时先建立 StringBuffer 或 StringBuilder 类对象进行操作,将最后结果转化成 String 类对象返回,这样效率会高很多。原创 2023-11-07 17:27:41 · 118 阅读 · 0 评论 -
Java中的字符串、数组、集合之间的各种转换(持续更新中......)
1、String char[]:字符串与char型数组之间的转换。2、数组Array与集合List之间的相互转换。3、数组Array 和 Set 之间的相互转换。原创 2023-11-06 13:54:27 · 781 阅读 · 0 评论 -
华为机试练习题:HJ10 字符个数统计
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次。例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3。输出 输入字符串 中范围在(0~127,包括0和127)字符的种数。数据范围: 1≤n≤500。输入一行没有空格的字符串。原创 2023-11-06 13:27:16 · 126 阅读 · 0 评论 -
Java实现创建链表与打印链表元素(可作为模板)
1、通过数组元素值,构造一个单向链表;2、将链表元素以数组的形式打印出来,如“[1, 2, 3, 4]”原创 2023-11-05 23:40:13 · 283 阅读 · 0 评论 -
算法题:203. 移除链表元素(递归法、设置虚拟头节点法等3种方法)Java实现创建链表与解析链表
讲一下设置虚拟头节点的那个方法,设置一个新节点指向原来链表的头节点,这样我们就可以通过判断链表的当前节点的后继节点值是不是目标删除值,来判断是否删除这个后继节点了。如果不设置虚拟头节点,则需要将头节点和后面的节点分开来讨论,代码会复杂一点。原创 2023-11-05 23:33:42 · 233 阅读 · 0 评论 -
算法题:33. 搜索旋转排序数组(二分法)
题目要求必须设计一个时间复杂度为O(log n)的算法解决此问题,所以我们可以采用二分法。Step1. 先把 nums[0] 作为目标值,通过二分法找到旋转点索引;Step2. 如果旋转点索引为0,则数组本身就是升序的,否则思想上可以将数组一分为二,看做两个升序数组。Step3. 判断 target 目标值在一分为二后的数组的哪一个里面,从而确定左右端索引。(特殊情况:如果旋转点索引为0,则左右端索引就是 0 和 nums.length - 1)。Step4. 二分法查找到 target。原创 2023-11-05 11:04:05 · 207 阅读 · 0 评论 -
java的集合类中哪些可以添加不同类型数据,哪些不可以?
在Java的集合类中,有些可以添加不同类型的数据,而有些则要求元素类型必须一致。原创 2023-11-04 21:55:33 · 604 阅读 · 0 评论 -
算法题:53. 最大子数组和(动态规划)Java & Python 实现
算法题:53. 最大子数组和(动态规划)Java & Python 实现原创 2023-11-04 20:09:43 · 217 阅读 · 0 评论 -
算法题:870. 优势洗牌
解题思路:田忌赛马的思想 + 贪心法。Step1. 对两个数组进行排序。Step2. 同时遍历排序后的nums2和nums1,将num1中刚好超过nums2当前值的值放到对应的位置,而不超过nums2当前值的值放到最后面去,因为反正这些值超不过nums2,不如把num1中较小的值用来对应nums2中较大的值。原创 2023-11-04 00:15:27 · 208 阅读 · 0 评论 -
算法题:16. 最接近的三数之和(Python & Java 详解)
Step1:先对数组排序,然后设置3个指针,遍历范围为(0~数组长度减2)。位置确定时,后面的数组元素首位各放置一个指针(Step3:如果三数之和=target,则返回target值;如果三数之和target,则将往前移动。Step4:当和重合时,则将往后移动。Step5:重复 Step2 到 Step4。直到遍历完。原创 2023-11-03 20:54:57 · 190 阅读 · 0 评论 -
算法题:144.二叉树的前序遍历(递归、迭代)Java & Python部分
二叉树的前序遍历(递归、迭代)Java实现原创 2023-11-03 11:27:27 · 114 阅读 · 0 评论 -
算法:Java构建二叉树并迭代实现二叉树的前序、中序、后序遍历
算法:Java构建二叉树并迭代实现二叉树的前序、中序、后序遍历。原创 2023-11-03 11:22:56 · 470 阅读 · 0 评论 -
Java中Deque栈对象的增删查(所有方法详解)
栈顶添加:push、offFirst栈尾添加:add、offer、offerLast栈顶删除:remove、pop、poll、pollFirst栈尾删除:pollLast栈顶查看:peek、peekFirst栈尾查看:peekLast原创 2023-11-03 10:31:41 · 709 阅读 · 0 评论 -
算法:Java构建二叉树并递归实现二叉树的前序、中序、后序遍历
Java构建二叉树并递归实现二叉树的前序、中序、后序遍历原创 2023-11-03 09:23:27 · 423 阅读 · 0 评论 -
算法题:99.恢复二叉搜索树
由二叉搜索树的定义可推知:二叉搜索树的中序遍历结果一定是严格由小到大排序的。由于“恢复二叉搜索树”的题目中指出“恰好两个节点的值被错误地交换”,那么我们只要找出破坏了这个顺序的两个节点,交换其节点值就可以了。本题最优解法是采用 Morris 中序遍历方法,也就是题目进阶要求里的使用O(1)空间的解决方案。原创 2023-11-02 18:07:06 · 218 阅读 · 0 评论 -
算法题:102.二叉树的层序遍历
层序遍历,看似简单,实则陷阱很多,怪不得该题目被认定为中等难度题。此处运用了迭代求解法。原创 2023-11-01 12:40:52 · 127 阅读 · 0 评论 -
算法题:最大出牌数量(某厂2023笔试题)
手里给一副手牌,数字从0-9,有r(红色),g(绿色),b(蓝色),y(黄色)四种颜色,出牌规则为每次打出的牌必须跟上一张的数字或者颜色相同,否则不能连续出牌。例如,手中有红色3,那么下次出牌可以出任意花色的3,或任意数字的红色牌,直至手中所有牌与上次出牌花色和数字都不匹配为止。求可打出牌的最大数量。原创 2023-10-24 18:00:45 · 280 阅读 · 0 评论 -
算法:94.实现中序遍历(3种方法:递归、迭代、Morris)Python & Java
中序遍历:左 -> 中-> 右,递归法,迭代法和Morris遍历法原创 2023-10-24 17:47:59 · 863 阅读 · 0 评论 -
序列式容器——vector
一、介绍1、vector是动态分配的数组,不必程序员手动去扩充数组大小,其原理:填充vector就像扔垃圾,家里的垃圾桶不够放,就倒到小区的大垃圾桶,小区大垃圾桶满了,就有垃圾车来回收,每次都是:分配新空间->复制元素->释放原空间,扩展方式采用倍增方式,通常是2倍增长,比如一开始大小为8,当你添加第9个元素是,它就会先扩展到大小为16,然后添加元素进去,倍数不能取太大,否则浪...原创 2023-10-23 15:08:11 · 205 阅读 · 1 评论 -
C++ 纠错题总结2
1、for循环中的判断语句: 要注意初始赋值、< 还是 <=for(int i = 0; i < n; i++)2、cin.getline(char[], int, char)注意:第二个参数为不是char[]的有效元素个数,因为最后一个元素位置要用来存储 '\0'3、函数形参有默认值的,有默认值的形参靠后放,而不能放在无默认的形参之前4、权限问题,类中不标...原创 2023-10-23 15:01:20 · 357 阅读 · 1 评论 -
Java 求两个数的最大公约数和最小公倍数(理解原理 > 背诵)
为什么反复执行 a % b ,即可得到最大公约数?(设定前提是a > b)其中的数学原理就是:a 和 b 的最大公约数 完全等同于b 和 a%b 的最大公约数原创 2023-10-17 17:48:35 · 208 阅读 · 0 评论 -
算法题:714.买卖股票的最佳时机含手续费(动态规划解法&贪心解法-详解)
贪心解法1)在连续递减的情况下买入价格最低时的股票,在不亏本的情况下如果连续递增则在最高点卖掉股票(因为要多考虑一个fee的费用,所以不亏本的前提要加上)。2)代码有点弯弯绕在里面,就是在还没买入的时候我们把手续费fee加到当前股票价格price上面,遍历prices数组,判断各个相邻price+fee后的大小,在连续递减的情况下选择最低点的买入。3)买入之后就要寻找最高点卖出,我们继续往后遍历,找到卖出能够有利润的第一支股票,设置一个“虚拟卖出”,由于后面的股票价格可能更高,所以这里不一定是当原创 2023-10-09 11:51:27 · 241 阅读 · 0 评论 -
算法题:122.买卖股票的最佳时机 II (贪心算法解决股票问题)
这道题是贪心算法的中级难度练习题,由于题目设定,整个价格都是透明的,这里并不涉及需要预测股票涨势的问题。解决思路不难,就是一旦股票价格开始下降了就买入,一旦上升了,就赶紧卖出。原创 2023-10-07 14:06:39 · 910 阅读 · 1 评论 -
算法题:738.单调递增的数字(贪心算法解决序列问题)
这道题参考了一位网友的思路,采用了贪心算法+动态规划,具体思路如下:1、从高到低遍历数字的每个位数,找到第一个数值递减(=),就得到了我们要的结果。原创 2023-10-07 10:26:34 · 369 阅读 · 0 评论 -
算法题:376.摆动序列(贪心算法解决序列问题)
这道题是一道贪心算法题,如果前两个数是递增,则后面要递减,如果不符合则往后遍历,直到找到符合的。原创 2023-10-07 05:04:31 · 553 阅读 · 0 评论 -
算法题:860.柠檬水找零(典型的贪心算法问题)
这道题就是纯贪心算法题,遍历每个顾客,先把钱收了,如果是10块钱就判断手里头有没有5元用于找零;如果是20块钱,先判断是不是有10元+5元,如果没有就再判断是否有3个5元。没有的话就直接返回 False。原创 2023-10-07 04:24:52 · 711 阅读 · 0 评论 -
算法题:1005.K 次取反后最大化的数组和(典型的贪心算法问题)
1、首先排序,然后从最小的负数开始一一变为正数,如果遍历到正数了,而k的次数没用完,如果剩余的k是偶数次,则直接可以退出了;如果k是奇数次且nums内有0元素也可以直接退出程序;如果k是奇数次且nums里面没有0元素,则挑一个最小的正数,将其置为负数,其实也就是比较正在遍历到的数和前一个数的大小,小的那个就是nums数组里的最小正数。2、还有一种情况就是,数组已经遍历完了,k没用完,这个也很简单,直接对数组的最后一个数,也就是数组里面最小非负数进行操作,如果其为0则直接退出,如果是k是偶数也可直接退出,原创 2023-10-07 03:50:22 · 196 阅读 · 0 评论 -
算法题:455.分发饼干(典型的贪心算法问题)
这个题目是贪心算法的基础练习题,解决思路是排序+双指针+谈心法,先将两个数组分别排序,优先满足最小胃口的孩子。原创 2023-10-07 03:06:16 · 427 阅读 · 0 评论