数据结构与算法(一)
文章目录
- 数据结构与算法(一)
- 1 位运算、算法是什么、简单排序
- 1.1 实现打印一个整数的二进制
- 1.2 给定一个参数N,返回1!+2!+3!+4!+...+N!的结果
- 1.3 简单排序算法
- 2 数据结构大分类、前缀和、对数器
- 2.1 实现前缀和数组
- 2.2 如何用1\~5的随机函数加工出1\~7的随机函数
- 2.3 如何把不等概率随机函数变成等概率随机函数
- 3 二分法、时间复杂度、动态数组、哈希表、有序表
- 3.1 有序数组中找到 num
- 3.2 有序数组中找到>=num最左的位置
- 3.3 有序数组中找打<=num最右的位置
- 3.4 局部最小问题
- 3.5 哈希表、有序表
- 4 链表相关的简单面试题
- 4.1 反转单链表
- 4.2 反转双链表
- 4.3 用单链表实现队列
- 4.4 用单链表实现栈
- 4.5 用双链表实现双端队列
- 4.6 K个一组翻转链表
- 4.7 两个链表相加问题
- 4.8 两个有序链表的合并
- 5 位图
- 5.1 位图
- 5.2 位运算实现加减乘除
- 6 比较器、优先队列、二叉树
- 6.1 合并多个有序链表
- 6.2 判断两棵树是否结构相同
- 6.3 判断一棵树是否是镜面树
- 6.4 返回一棵树的最大深度
- 6.5 用先序数组和中序数组重建一棵树
- 6.6 二叉树先序、中序、后序遍历的代码实现、介绍递归序
- 7 二叉树
- 7.1 二叉树按层遍历并收集节点
- 7.2 判断是否是平衡搜索二叉树
- 7.3 在二叉树上能否组成路径和
- 7.4 在二叉树上收集所有达标的路径和
- 7.5 判断二叉树是否是搜索二叉树
- 8 归并排序和快速排序
- 8.1 归并排序的递归实现和非递归实现
- 8.2 快速排序的递归实现和非递归实现
数据结构与算法(一)
1 位运算、算法是什么、简单排序
1.1 实现打印一个整数的二进制
public static void print(int num) {// int 32位,依次打印高位到低位(31 -> 0)的二进制值for (int i = 31; i >= 0; i--) {System.out.print((num & (1 << i)) == 0 ? "0" : "1");}System.out.println();
}42361845 => 00000010100001100110001111110101
Integer.MAX_VALUE => 01111111111111111111111111111111
Integer.MIN_VALUE => 10000000000000000000000000000000
1.2 给定一个参数N,返回1!+2!+3!+4!+…+N!的结果
- 方法一:
public static long f1(int n) {long ans = 0;for (int i = 1; i <= n; i++) {ans += factorial(i);}return ans;
}public static long factorial(int n) {long ans = 1;for (int i = 1; i <= n; i++) {ans *= i;}return ans;
}
- 方法二:每次都基于上次计算结果进行计算 -> 更优
public static long f2(int n) {// 第1次:1! -> cur// 第2次: 2! = 1!*2 -> cur*2 -> cur// 第3次: 3! = 2!*3 -> cur*3 -> cur// ...// 第n次: n! = (n-1)!*n -> cur*nlong ans = 0;long cur = 1;for (int i = 1; i <= n; i++) {cur = cur * i;ans += cur;}return ans;
}
1.3 简单排序算法
- 选择排序:
// [1,len) -> find minValue -> 与 0 位置交换
// [2,len) -> find minValue -> 与 1 位置交换
// ...
// [i,len) -> find minValue -> 与 i - 1 位置交换
public static void selectSort(int[] arr) {if (arr == null || arr.length < 2) return;int len = arr.length;for (int i = 0; i < len; i++) {int minValueIndex = i;for (int j = i + 1; j < len; j++) {minValueIndex = arr[j] < arr[minValueIndex] ? j : minValueIndex;}swap(arr, i, minValueIndex);}
}
- 冒泡排序:
// [0, len) -> 两两比较并交换 -> maxValue放到 len-1 位置
// [0, len-1) -> 两两比较并交换 -> maxValue放到 len-2 位置
// ...
// [0, len-i) -> 两两比较并交换 -> maxValue放到 len-i-1 位置
public static void bubbleSort(int[] arr) {if (arr == null || arr.length < 2) return;int len = arr.length;for (int i = len - 1; i >= 0; i--) {for (int j = 1; j <= i; j++) {if (arr[j - 1] > arr[j]) {swap(arr, j - 1, j);}}}
}// 优化:
public static void bubbleSort(int[] arr) {if (arr == null || arr.length < 2) return;int len = arr.length;for (int i = len - 1; i >= 0; i--) {boolean flag = false;for (int j = 1; j <= i; j++) {if (arr[j - 1] > arr[j]) {swap(arr, j - 1, j);flag = true;}}if (!flag) { // 如果没发生交换,说明已经有序,可以提前结束break;}}
}
- 插入排序:
// [0,0] -> 有序,仅一个数,显然有序
// [0,1] -> 有序 -> 从后往前两两比较并交换
// [0,2] -> 有序 -> 从后往前两两比较并交换
// ...
// [0,len-1] -> 有序 -> 从后往前两两比较并交换
public static void insertSort(int[] arr) {if (arr == null || arr.length < 2) return;int len = arr.length;for (int i = 1; i < len; i++) {int pre = i - 1;while (pre >= 0 && arr[pre] > arr[pre + 1]) {swap(arr, pre, pre + 1);pre--;}// // 写法二:
// for (int pre = i - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) {
// swap(arr, pre, pre + 1);
// }}
}
2 数据结构大分类、前缀和、对数器
-
内容:
-
什么是数据结构,组成各种数据结构的最基本元件?
- 数组、链表
-
前缀和数组
-
随机函数
-
对数器的使用
-
2.1 实现前缀和数组
- 求一个数组 array 在给定区间 L 到 R 之间([L,R],L<=R)数据的和。
// 方法一:每次遍历L~R区间,进行累加求和
public static class RangeSum1 {private int[] arr;public RangeSum1(int[] array) {arr = array;}public int rangeSum(int L, int R) {int sum = 0;for (int i = L; i <= R; i++) {sum += arr[i];}return sum;}
}// 方法二:基于前缀和数组,做预处理
public static class RangeSum2 {private int[] preSum;public RangeSum2(int[] array) {int N = array.length;preSum = new int[N];preSum[0] = array[0];for (int i = 1; i < N; i++) {preSum[i] = preSum[i - 1] + array[i];}}public int rangeSum(int L, int R) {return L == 0 ? preSum[R] : preSum[R] - preSum[L - 1];}
}
2.2 如何用1~5的随机函数加工出1~7的随机函数
// 此函数只能用,不能修改
// 等概率返回1~5
private static int f() {return (int) (Math.random() * 5) + 1;
}
// 等概率得到0和1
private static int f1() {int ans = 0;do {ans = f();} while (ans == 3);return ans < 3 ? 0 : 1;
}
// 等概率返回0~6
private static int f2() {int ans = 0;do {ans = (f1() << 2) + (f1() << 1) + f1();} while (ans == 7);return ans;
}
// 等概率返回1~7
public static int g() {return f2() + 1;
}public static void main(String[] args) {int testTimes = 10000000;int[] counts = new int[8];for (int i = 0; i < testTimes; i++) {int num = g();counts[num]++;}for (int i = 0; i < 8; i++) {System.out.println(i + "这个数,出现了 " + counts[i] + " 次");}
}
- 测试结果
0这个数,出现了 0 次
1这个数,出现了 1428402 次
2这个数,出现了 1427345 次
3这个数,出现了 1428995 次
4这个数,出现了 1428654 次
5这个数,出现了 1428688 次
6这个数,出现了 1428432 次
7这个数,出现了 1429484 次
2.3 如何把不等概率随机函数变成等概率随机函数
// 你只能知道,f会以固定概率返回0和1,但是x的内容,你看不到!
public static int f() {return Math.random() < 0.84 ? 0 : 1;
}// 等概率返回0和1
public static int g() {int first = 0;do {first = f(); // 0 1} while (first == f());return first;
}public static void main(String[] args) {int[] count = new int[2];// 0 1for (int i = 0; i < 1000000; i++) {int ans = g();count[ans]++;}System.out.println(count[0] + " , " + count[1]);
}
3 二分法、时间复杂度、动态数组、哈希表、有序表
- 内容:
- 二分法
- 使用二分法解决不同的题目
- 时间复杂度
- 动态数组
- 按值传递、按引用传递
- 哈希表
- 有序表
3.1 有序数组中找到 num
// arr保证有序
public boolean find(int[] arr, int num) {if (arr == null || arr.length == 0) return false;int l = 0, r = arr.length - 1;while <
相关文章:
数据结构与算法(一)
文章目录 数据结构与算法(一)1 位运算、算法是什么、简单排序1.1 实现打印一个整数的二进制1.2 给定一个参数N,返回1!+2!+3!+4!+...+N!的结果1.3 简单排序算法2 数据结构大分类、前缀和、对数器2.1 实现前缀和数组2.2 如何用1\~5的随机函数加工出1\~7的随机函数2.3 如何把不…...
Matlab--微积分问题的计算机求解
目录 1.单变量函数的极限问题 1.1.公式例子 1.2.对应例题 1 2.多变量函数的极限问题 3.函数导数的解析解 4.多元函数的偏导数 5.Jacobian函数 6.Hessian矩阵 7.隐函数的偏导 8.不定积分问题的求解 9.定积分的求解问题 10. 多重积分的问题求解 1.单变量函数的极限问题 …...
GRU实现时间序列预测(PyTorch版)
💥项目专栏:【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码数据集原理介绍) 文章目录 前言一、基于PyTorch搭建GRU模型实现风速时间序列预测二、时序数据集的制作三、数据归一化四、数据集加载器…...
文本框粘贴时兼容Unix、Mac换行符的方法源码
本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》(www.518cj.net)的时候,要在文本框粘贴从别处复制来的名单。发现一个问题,就是一些Unix传过来的多行文本,粘贴后都变成了一行。原来&a…...
2023年华为杯研究生数学建模竞赛辅导
2023年华为杯研究生数学建模竞赛辅导 各研究生培养单位: 中国研究生数学建模竞赛作为教育部学位管理与研究生教育司指导,中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一,是一项面向在校…...
post更新,put相当于删除重新增一条
索引数据 //删除后新增 PUT my_dynamic_temp/_doc/1 { “name”:“test”, “class”:“1204” } //覆盖更新 POST my_dynamic_temp/_update/1 { “doc”: { “name”:“test”, “class”:“1203”, “pernum”:“998” } }...
python责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在Python中,你可以使用多线程来实现责任链模式的框架。 首先,你需要定义一个基础的处理者类,它包含处理请求的方…...
大数据技术准备
Hbase:HBase 底层原理详解(深度好文,建议收藏) - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store,那么这些store在不同的region Hbase写流程(读比写慢) MemStore Flush Hbas…...
【力扣周赛】第 362 场周赛(⭐差分匹配状态压缩DP矩阵快速幂优化DPKMP)
文章目录 竞赛链接Q1:2848. 与车相交的点解法1——排序后枚举解法2——差分数组⭐差分数组相关题目列表📕1094. 拼车1109. 航班预订统计2381. 字母移位 II2406. 将区间分为最少组数解法1——排序贪心优先队列解法2——差分数组 2772. 使数组中的所有元素…...
四大函数式接口(重点,必须掌握)
新时代程序员必须要会的 :lambda表达式、链式编程、函数式接口、Stream流式计算 什么是函数式接口 1.函数型接口 package com.kuang.function;import java.util.function.Function;/*** Function函数型接口 有一个输入参数,有一个输出* 只要是函数式接口…...
2023Web前端逻辑面试题
1、现有9个小球,已知其中一个球比其它的重,如何只用天平称2次就找出该球? ①把9个球分成三份,三个一份; ②拿出其中两份进行称量;会分为两种情况 若拿出的两份小球称量结果,重量相等;…...
uniapp中git忽略node_modules,unpackage文件
首先在当前项目的命令行新建.gitignore文件: touch .gitignore再在编辑器中打开该文件,并在该文件中加入需要忽略的文件名: node_modules/ .project unpackage/ .DS_Store 提示:如果以前提交过unpackage文件的话,需…...
Json-Jackson和FastJson
狂神: 测试Jackson 纯Java解决日期格式化 设置ObjectMapper FastJson: 知乎:Jackson使用指南 1、常见配置 方式一:yml配置 spring.jackson.date-format指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的…...
RK3588 点亮imx586摄像头
一.硬件原理图 mipi摄像头硬件确认点: 1.供电:5V,2.8V,1.2V,1.8V,reset脚(硬拉3.3,上电的时候从低到高),pwron脚外接 3.3V。 2,时钟:MCLKOUT是2…...
C++---继承
继承 前言继承的概念及定义继承的概念继承定义继承关系和访问限定符 基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员**多重继承**多继承下的类作用域菱形继承虚继承使用虚基类 支持向基类的常规类型转换 前言 在需要写Father类和Mother…...
使用新版Maven-mvnd快速构建项目
目前我们项目的构建方式多数是 maven、gradle,但是 maven 相对 gradle 来说,构建速度较慢,特别是模块相对较多的时候,构建速度更加明显。但是我们将项目由 maven 替换为 gradle 相对来说会比较麻烦,成本较高。于是我们…...
【ICASSP 2023】ST-MVDNET++论文阅读分析与总结
主要是数据增强的提点方式。并不能带来idea启发,但对模型性能有帮助 Challenge: 少有作品应用一些全局数据增强,利用ST-MVDNet自训练的师生框架,集成了更常见的数据增强,如全局旋转、平移、缩放和翻转。 Contributi…...
MySQL 面试题——MySQL 基础
目录 1.什么是 MySQL?有什么优点?2.MySQL 中的 DDL 与 DML 是分别指什么?3.✨数据类型 varchar 与 char 有什么区别?4.数据类型 BLOB 与 TEXT 有什么区别?5.DATETIME 和 TIMESTAMP 的异同?6.✨MySQL 中 IN …...
JDK9特性——概述
文章目录 引言JDK9特性概述JDK9的改变JDK和JRE目录变化总结 引言 JAVA8 及之前,版本都是特性驱动的版本更新,有重大的特性产生,然后进行更新。 JAVA9开始,JDK开始以时间为驱动进行更新,以半年为周期,到时…...
征战开发板从无到有(三)
接上一篇,翘首已盼的PCB板子做好了,管脚约束信息都在PCB板上体现出来了,很满意,会不会成为爆款呢,嘿嘿,来,先看看PCB裸板美图 由于征战开发板电路功能兼容小梅哥ACX720,大家可以直…...
Linux设备树详细学习笔记
参考文献 参考视频 开发板及程序 原子mini 设备树官方文档 设备树的基本概念 DT:Device Tree //设备树 FDT: Flattened Device Tree //开放设备树,起源于OpenFirmware (所以后续会见到很多OF开头函数) dts: device tree source的缩写 //设备树源码 dtsi: device …...
【系统架构】系统架构设计基础知识
导读:本文整理关于系统架构设计基础知识来构建系统架构知识体系。完整和扎实的系统架构知识体系是作为架构设计的理论支撑,基于大量项目实践经验基础上,不断加深理论体系的理解,从而能够创造新解决系统相关问题。 目录 1、软件架…...
快递、外卖、网购自动定位及模糊检索收/发件地址功能实现
概述 目前快递、外卖、团购、网购等行业 :为了简化用户在收发件地址填写时的体验感,使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家;让大家理解辅助定位及模糊地址检索的功能实现过程,以及开发出自己理想的作品…...
Springboot后端导入导出excel表
一、依赖添加 操作手册:Hutool — 🍬A set of tools that keep Java sweet. <!--hutool工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.20</versio…...
通过stream流实现分页、模糊搜索、按列过滤功能
通过stream实现分页、模糊搜索、按列过滤功能 背景逻辑展示示例代码 背景 在有一些数据通过数据库查询出来后,需要经过一定的逻辑处理才进行前端展示,这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐…...
webpack:系统的了解webpack一些核心概念
文章目录 webpack 如何处理应用程序?何为webpack模块chunk?入口(entry)输出(output)loader开发loader 插件(plugin)简介流程插件开发:Tapable类监听(watching)compiler 钩子compilation 钩子compiler和compilation创建自定义 插件 loader和pl…...
Unreal Engine Loop 流程
引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中,做了一个图。记录一下!! ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录,以备后用…...
FLASK中的鉴权的插件Flask-HTTPAuth
在 Web 应用中,我们经常需要保护我们的 api,以避免非法访问。比如,只允许登录成功的用户发表评论等。Flask-HTTPAuth 扩展可以很好地对 HTTP 的请求进行认证,不依赖于 Cookie 和 Session。本文主要介绍两种认证的方式:…...
linux万字图文学习进程信号
1. 信号概念 信号是进程之间事件异步通知的一种方式,属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…...
DataX实现Mysql与ElasticSearch(ES)数据同步
文章目录 一、Linux环境要求二、准备工作2.1 Linux安装jdk2.2 linux安装python2.3 下载DataX: 三、DataX压缩包导入,解压缩四、编写同步Job五、执行Job六、定时更新6.1 创建定时任务6.2 提交定时任务6.3 查看定时任务 七、增量更新思路 一、Linux环境要求…...
网站设计到底做多宽/软文推广的标准类型
期刊联系地址...
服装网站源码php/搜索引擎优化关键词的处理
RelativeLayout:基于其他控件(包括同容器中控件和容器(父)控件)的layout 相对于容器控件(父控件) android:layout_alignParentLeft"true" 将控件的左边缘和父控件的左边缘对齐 RelativeLayout andro…...
第三方交易网站怎么做/软文之家
对于数据库中表空间查看,想必大家都有很多的脚本已经在用了,自己也啰嗦一下,分享一个通过shell脚本查看表空间使用情况的例子。对于数据库中表空间查看,想必大家都有很多的脚本已经在用了,,自己也啰嗦一下&…...
专业做网站制作自助建站系统/平台推广销售话术
写在前面 本文接k8s之ingress 。 本文看一个基于ingress作为流量入口的实战例子,架构图如下: 接下来详细看下。 1:部署MariaDB 首先我们需要定义MariaDB使用的configmap,如下: apiVersion: v1 kind: ConfigMap meta…...
石头科技 网站开发/网络推广销售是做什么的
文章目录云效软件测试和质量保证1. 云效平台测试管理功能介绍2. 云效测试用例3. 云效测试计划4. 云效测试用例执行与报告云效软件测试和质量保证 1. 云效平台测试管理功能介绍 1. 测试管理简介: 云效的「测试管理」功能包含对测试计划与执行用例的创建、编辑、规…...
网站推广方案策划书/怎么可以让百度快速收录视频
熬夜删掉Linux中删除不掉的文件<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />今天在做关于shell的作业时不知咋的生成了一个一–z开头的文件,怎么删都删不掉,如图:<?xml:namespace pref…...