数据结构与算法
HelloWorld. py
后端敲门人
展开
-
按照层次遍历结果打印完全二叉树
完全二叉树,层次遍历,打印原创 2024-01-04 12:49:55 · 622 阅读 · 0 评论 -
java实现二叉树的遍历与构造以及三个简单问题
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:41返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。原创 2023-07-23 14:40:09 · 227 阅读 · 0 评论 -
数组-双指针
【代码】数组-双指针。原创 2023-04-20 09:47:16 · 103 阅读 · 0 评论 -
链表【java实现】
链表的java实现,包括增删改查,反转链表原创 2022-09-18 16:45:22 · 588 阅读 · 2 评论 -
华为机试 HJ32 密码截取【java实现】
华为机试 HJ32密码截取原创 2022-08-03 21:57:25 · 307 阅读 · 0 评论 -
华为机试 HJ31 单词倒排【Java实现】
华为机试 HJ31 单词倒排, Java, 字符串原创 2022-07-01 23:21:13 · 232 阅读 · 0 评论 -
华为机试 HJ29 字符串加解密【java实现】
华为机试, java实现,字符串原创 2022-06-26 10:54:58 · 225 阅读 · 0 评论 -
链表(java实现)
java实现链表的头插法与尾插法原创 2022-06-07 19:26:00 · 283 阅读 · 1 评论 -
常见排序算法java实现
常见排序算法:选择排序、插入排序、归并排序、希尔排序、快速排序、冒泡排序 的java实现原创 2022-06-05 19:02:50 · 178 阅读 · 0 评论 -
希尔排序java实现
希尔排序的思想是使数组中任意间隔为h的元素都是有序的原创 2022-06-04 23:33:22 · 167 阅读 · 0 评论 -
随机生成m个和为n的数
方法一: 转换为将 n 随机分给m个数这个问题的难点在于:如何保证m个随机数 和为 n。所以不妨转换思路为:将 n 随机分给 m 个数。eg:如果要生成 9 个和为 100 的随机数,且随机数为 int。那不妨将 100拆分成 100 个 1 然后随机分给 9 个数。以下是具体讨论1. 随机生成 m 个和为 n 的数, 生成的数为 int/* 1. 定义一个数组,数组长度为m. 2. 由于int数组的初值为0, 所以只需要随机从数组里取出数,然后加1 3原创 2022-01-09 12:15:43 · 640 阅读 · 0 评论 -
最长公共前缀
题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入:strs = [“flower”,“flow”,“flight”]输出:“fl”示例 2:输入:strs = [“dog”,“racecar”,“car”]输出:""题目来源力扣题目解析package com.wy.leetCode;/** * @author HelloWorld * @create 2021/10/19 21:01 * @原创 2021-10-19 21:32:18 · 177 阅读 · 0 评论 -
外观数列 力扣
题目描述给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = "1"countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。前五项如下:1. 12. 113. 214. 12115. 111221第一项是数字 1 描述前一项,这个数是 1 即 “ 一 个 1 ”原创 2021-10-18 22:03:36 · 194 阅读 · 0 评论 -
实现 strStr() (KMP算法)
实现 strStr()题目描述实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的&n原创 2021-10-01 15:25:28 · 191 阅读 · 1 评论 -
力扣___回文数
回文数题目描述给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入:x = 121输出:true示例 2:输入:x = -121输出:false示例 3:输入:x = 10输出:false示例 4:输入:x = -101输出:false题目来源力扣题目解析利用StringBui原创 2021-09-24 16:12:03 · 228 阅读 · 0 评论 -
字符串转换整数 (atoi)
字符串转换整数 (atoi)题目描述请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将原创 2021-09-23 09:16:24 · 272 阅读 · 0 评论 -
随机生成红包
请实现一个红包算法,支持输入红包金额(元为单位)和红包个数,输出各个红包金额。提供完备单元测试要求:1. 每个红包的最大金额不能超过红包金额的90%,最低不能低于1%(40分)2. 输入的红包金额只支持整数,输出的每个红包的结果需要支持到分(小数点后两位 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int money; whil原创 2021-09-13 21:23:18 · 372 阅读 · 0 评论 -
有效的数独
有效的数独题目描述请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 ‘.’ 表示。注意:一个有效的数独(部分已被填充)不一定是可解的。只需要根据以上规则,验证已经填入的数字是否有效即可。示例 1:输入:board =[[“5”,“3”,"原创 2021-05-12 22:14:46 · 226 阅读 · 0 评论 -
旋转图像
旋转图像题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输原创 2021-05-12 22:14:13 · 231 阅读 · 0 评论 -
两数之和
两数之和题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]示例 2:输入:nums = [3,2,4], targe原创 2021-05-10 15:00:11 · 402 阅读 · 0 评论 -
移动零
移动零题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。题目来源力扣(LeetCode)题目解析1.遍历数组2.判断当前值是否为0 如果为0,记录0出现的次数 如果不为0, 则它的位置应该它当前的位置 - 0出现的次数public void moveZeroes(i原创 2021-05-10 13:03:36 · 235 阅读 · 0 评论 -
加一
题目描述给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例 2:输入:digits = [4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字 4321。示例 3:输入:digits = [0]输出:[1]来源:力扣(LeetCo原创 2021-05-09 20:17:50 · 249 阅读 · 0 评论 -
只出现一次的数字
题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4来源:力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/思路解析利用set 不能含有重复的元素的特点,遍历数组,将元素添加到set中,如果添加失败证明出原创 2021-05-09 16:53:00 · 197 阅读 · 0 评论 -
两个数组的交集
题目描述给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii思路解析利用map分别统计两个数组中数据的出现次数利用map存储交集原创 2021-05-09 16:47:40 · 198 阅读 · 0 评论 -
数组中的重复数字
数组中的重复数字题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1题目来源牛客思路解析有很多解法。但是如果考虑到时间复杂度和空间复杂度都较优的情况下解决这个问题,就还挺好玩的只遍历一次,不额外使用数组将数组中的每一个元素放到到该在的位置。放原创 2021-04-26 22:57:22 · 206 阅读 · 0 评论 -
旋转数组
旋转数组题目描述给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数进阶: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]示例 2:输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]题目来源力扣(LeetCode)思路解析方原创 2021-04-23 12:52:27 · 277 阅读 · 0 评论 -
删除排序数组中的重复项
删除排序数组中的重复项问题描述给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]示例 2:输入:nums = [0,0,1,1,1,2,2,3,3,4]输出:5, nums = [0,1,2,3,4]题目来源力扣(LeetCode)思路解析原创 2021-04-20 21:04:27 · 194 阅读 · 0 评论 -
合并两个有序数组
合并两个有序数组题目描述给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:num原创 2021-04-16 22:34:17 · 326 阅读 · 1 评论 -
搜索二维矩阵 II
搜索二维矩阵 II题目描述编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。示例 1:输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5输出:true示例 2:输入:matrix = [[1,原创 2021-04-14 22:55:55 · 230 阅读 · 1 评论 -
多数元素(力扣)
多数元素题目描述给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[3,2,3]输出:3示例 2:输入:[2,2,1,1,1,2,2]输出:2进阶尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。题目链接链接:https://leetcode-cn.com/leetbook/read/top-interview-原创 2021-04-13 10:29:02 · 279 阅读 · 0 评论 -
只出现一次的数字(力扣)
只出现一次的数字(力扣)题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4题目链接链接:https://leetcode-cn.com/leetbook/read/top-interview-questions/xm0u83/来源:力扣(Leet原创 2021-04-13 09:50:38 · 219 阅读 · 0 评论 -
数组赋不同的随机数值
数组赋不同的随机数值问题描述创建一个长度为6的int型数组,要求取值为1-30,同时元素值各不相同解决思路借用数组 values,存放已经被赋值过的元素,每次赋值前进行判断,如果该元素还未被赋值,让其赋值。被赋值元素的值作为values[] 的下标,未被赋值的元素value[i] = 1 一旦赋值 value[i]++;package com.wy;/** * @author HelloWorld * @create 2021-04-12-21:10 * @email 15原创 2021-04-12 22:44:46 · 538 阅读 · 0 评论 -
排序算法
内部排序算法分类插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序简单选择排序堆排序归并排序基数排序直接插入排序算法思想对于一组数据,只有一个数时,一定有序。因此只需要从第二个数开始确定它在有序序列中的位置,然后将其移到该位置算法实现步骤/** * 直接插入排序(从小到大) * 从第二位开始,依次向前比较,如果遇到比它大的移动位置 */public static void insertDirectly(int[]原创 2021-04-08 21:35:59 · 224 阅读 · 0 评论 -
简单选择排序
简单选择排序算法思想每次选择一个最小的元素,然后与原位置上的元素进行交换实现步骤 /** * 简单选择排序(从小到大) * 每次选择一个最小的元素,然后与原位置上的元素进行交换 */ public static void chooseSmiple(int[] array) { for (int i = 0; i < array.length; i++) { int min = array[i];原创 2021-04-08 21:35:10 · 186 阅读 · 0 评论 -
快速排序
快速排序算法思想每次选择一个数作为基数(一般都选第一个数),将所有比这个数大的放在这个数的右边,比它小的放左边对新产生的两个序列分别按上诉方法再次拆分对于 3 7 2 6 1 4 5 这个序列选择第一个数 3 作为基数, 用两个指针实现把比基数大的移到右边,比基础小的移到左边。(1)要先动 high指针,5 > 3 不用移动,所以 high–, 此时 4 > 3 high – , 1 < 3就令 array[low] = array[high] (low原创 2021-04-08 21:34:20 · 219 阅读 · 0 评论 -
冒泡排序
冒泡排序算法思想每轮从 i = 0 开始,确定一个最大的数或者最小的数实现/** * 冒泡排序 (从小到大) * 每一次都从 i = 0开始,与相邻的下一个元素开始比较,遇到比它小的交换位置,直到数组有序为止 * 第一个for 循环控制一共需要比较几轮 len - 1 * 第二个for 循环控制每次比较的次数 */public static void bubble(int[] A) { int[] array = A; System.out.println(原创 2021-04-08 21:33:24 · 264 阅读 · 0 评论 -
折半插入排序
折半插入排序算法思想 基于直接插入排序,只是在确定插入位置时采用折半查找实现/** * 折半插入排序 * 跟直接插入相比只是在查找位置时,采用折半查找。 */public static void halfInsert(int[] A) { int[] array = A; int len = array.length; for (int i = 1; i < len ; i++) { // 存放当前value的值 int原创 2021-04-08 21:32:21 · 201 阅读 · 0 评论 -
直接插入排序
直接插入排序算法思想对于一组数据,只有一个数时,一定有序。因此只需要从第二个数开始确定它在有序序列中的位置,然后将其移到该位置算法实现步骤/** * 直接插入排序(从小到大) * 从第二位开始,依次向前比较,如果遇到比它大的移动位置 */public static void insertDirectly(int[] A) { int[] array = A; System.out.println("初始:"); inputArray(array);原创 2021-04-08 21:31:03 · 189 阅读 · 0 评论 -
质数
package com.wy;/** * @author HelloWorld * @create 2021-04-06-8:50 * @email 154803771@qq.com */public class PrimeNumber { // 输出155以内的质数 public static void main(String[] args) { label: for (int i = 2; i <= 155; i++) { .原创 2021-04-06 09:11:03 · 185 阅读 · 0 评论 -
求最小公倍数的三种方法
求最小公倍数的三种方法方法(一) 较大数的倍数对较小数取余方法(二) 公式法 两个数的 乘积 等于他们的 最大公约数 * 最小公倍数方法(三) 分解质因数 不同的质因数出现几次乘几次,相同的质因数累乘出现最多的次数示例:12 的质因数 226 的质因数 2 13最小公倍数 2 * 2 * 3 * 13package com.wy;/** * @author HelloWorld * @create 2021-04-06-9:36 * @email 154803771@qq原创 2021-04-08 09:05:04 · 6244 阅读 · 4 评论