自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法导论16章贪心算法习题活动教室分配问题(区间图着色问题)分析详解与代码实现

算法导论 贪心算法 区间图着色问题 活动教室分配 详解 实现 具体代码 详细代码

2023-10-24 20:32:25 1426

原创 算法导论(第三版)CH15-动态规划习题15-10投资策略规划题目实现详解(附代码)

在算法导论(第三版)第15章动态规划最后的习题中,有一道15-10投资策略规划的题目,网上相关的讲解不是很多,或者算法的时间复杂度也较高,因此将具体实现分享如下。

2023-08-25 16:37:07 457

原创 Cargo包管理器的简单介绍

Rust 语言中的 Cargo 是其包管理器,它用于管理 Rust 项目中的依赖关系、构建和发布等任务。Cargo作为Rust的官方的包管理器,为Rust的项目构建、流行起到了不可替代的作用,也为Rust编程、工程管理提供了极大的帮助和便利性。在安装 Rust 的同时,Cargo 会被自动安装。

2023-08-24 14:28:07 417

原创 Rust的第一个程序:“Hello World”

所有编程语言的学习,第一个程序都是"Hello World",我们也从"Hello World"开始。

2023-08-24 14:17:24 179

原创 Rust的安装

Rust 是一种编程语言,它的设计目标是提供安全、并发、高效的编程体验。要开始使用 Rust,您需要在您的计算机上安装它。以下是在 Windows、Linux 和 macOS 上安装 Rust 的步骤。以上就是在 Windows、Linux 和 macOS 上安装 Rust 的步骤。希望这可以帮助您开始使用这种编程语言。下载并安装 Homebrew。这是一个包管理器,它将帮助您安装 Rust。现在,您可以开始编写 Rust 程序了。现在,您可以开始编写 Rust 程序了。输入您的密码,然后继续安装。

2023-08-24 14:04:17 376

原创 初识Dart语言

总之,Dart是一种功能强大且易于使用的编程语言,适用于Web开发、桌面应用、移动应用和服务器端开发等多个领域。它的简单易学、性能优异和易于调试等特点使得开发者能够更加高效地构建各种类型的应用程序。随着Dart社区的不断壮大和更多企业的支持,Dart将会成为一种越来越受欢迎的编程语言。Dart是Google开发的一种静态类型、编译到JavaScript的Web编程语言。Dart语言的设计目标是解决现代Web开发中遇到的一些挑战,如代码复杂性、性能问题以及跨浏览器兼容性等。Dart编程语言简介。

2023-08-23 15:10:00 339

原创 为什么要学习数据结构和算法

数据结构的作用是帮助人们更好地组织和管理数据,使数据的访问、修改和操作更为高效和方便。算法是计算机科学的基础,用于解决许多不同的问题,例如排序、搜索、图形处理、人工智能等等。对计算科学的发展有重要作用:数据结构是计算机科学的一个重要分支,为计算科学的发展提供了坚实的理论基础和技术支持。方便代码维护和开发:良好的数据结构可以使代码的可读性、可维护性和可扩展性更好,从而方便代码的开发和维护。更好地满足需求:不同的数据结构适用于不同的场景和需求,选择合适的数据结构可以更好地满足问题需要。一、什么是数据结构?

2023-08-23 10:53:33 533

原创 初识Rust语言

生命周期参数化的类型(Lifetime Parameterized type):Rust允许将生命周期作为泛型参数,以此来保证引用的有效性。生命周期参数化的类型是Rust中的高级特性,用于处理复杂的数据结构和算法。Trait:Trait是Rust中的一种抽象类型,类似于其他语言中的接口。生命周期(Lifetime):Rust要求在编译时验证所有借用的合法性,因此需要标识出每个变量的生命周期。模式匹配(Pattern Matching):模式匹配是Rust中的重要特性,它允许匹配值的模式并执行相应操作。

2023-08-23 10:42:36 191 1

原创 巧妙求解最长单调递增子序列LIS序列本身的O(nlogn)的代码实现

如何求解最长单调递增子序列LIS序列本身?最长单调递增子序列的长度好求,网上比比皆是,但求LIS本身的值或每个元素的位置索引呢?

2023-05-09 18:13:07 166

原创 Rust学习笔记(16)——单向链表之四:链表的遍历和反转

前几篇学习了插入和删除等操作,再尝试实现一下遍历和翻转。一、遍历遍历的实现比较简单,从头节点开始逐个后移即可。下面是一个比较简单的实现,只是依次打印出节点的值。impl BoxedLinkedList { fn traverse(&self) { let mut curr = self.head.as_ref(); while curr.is_some() { print!("{:?}\t", curr.unwrap().

2021-04-08 19:36:15 1146

原创 Rust学习笔记(15)——struct、Option和Box组合应用实现单向链表之三

本次学习实现链表中间的插入和删除。插入按照从小到大的顺序插入,删除则为找到要删除的值,删除节点。一、插入首先我们假设链表是有序的。插入的值为value,插入操作也是从头开始向后遍历链表,找到符合以下条件的节点curr:curr.val < value; curr.next.val >= value;要考虑几种特殊情况:链表为空; 插入的值小于头结点的值; 插入的值大于尾节点的值;实现代码如下:impl BoxedLinkedList { fn inser.

2021-04-08 18:00:18 402

原创 Rust学习笔记(14)——struct、Option和Box组合应用实现单向链表之二

在上一篇学习了链表的头部插入和删除,今天尝试一下尾部的插入和删除。一、尾部插入在链表的尾部插入,分几种情况:链表为空:直接将头指针指向新节点;否则进入第二步: 从头结点开始向后一直找到尾节点,将新节点挂到尾节点上。实现时的与C的区别在于向后的遍历找到尾部节点,因为所有权的限制,不能像C语言那样写:curr = curr->next;完整代码如下:impl BoxedLinkedList { fn push_back(&mut self, value: i

2021-04-08 14:46:59 542

原创 Rust学习笔记(13)——struct、Option和Box组合应用实现单向链表

前面深入学习了struct、Option和Box的所有权约束及各种场景的使用,现在用struct、Option和Box组合来实现一个单向链表,并实现链表常见的头部插入、删除,尾部插入、删除,中间插入、删除,链表反转,遍历等操作。一、链表和节点定义为了方便演示,我们先定义节点,以及节点的new 和link操作,然后再定义一个链表结构体,其中仅有一个头指针成员。1.1 先定义节点及节点的new / link 操作#[derive(Debug)]struct Node { val: i

2021-04-07 18:39:04 1290

原创 Rust学习笔记(12)——Box智能指针

在rust编程语言的官方介绍中,对于Box智能指针介绍比较简单,只说其可以包裹一个变量,将变量存在堆上,Box中包含堆上的地址。同时Box指针实现了自动解引用trait。在实际操作中,也确实类似,对其操作与对普通类型操作类似,支持连续引用和解引用,在编译器不能自动解引用时,需要手动解引用。Box指针看似简单,实际上在复杂的应用场景中也有很多情况,我们从简单变量的指针开始。一、简单变量的指针操作对于简单变量,操作可以如下:(例子-1)fn main() { let m...

2021-04-07 12:55:19 2114

原创 Rust学习笔记(11)——Option和struct组合带来的所有权问题及总结

在上一篇的基础上,我们加一层Option的包裹。还是先定义struct:#[derive(Debug)]struct Point { x: Box<i32>, y: i32,}下列代码不可编译:fn main() { let a = Some(Point { x: Box::new(5), y: 5, }); let b = a.as_ref(); let c = b.unwrap();

2021-04-06 23:21:44 1094

原创 Rust学习笔记(10)——引用和解引用的所有权问题

先定义一个struct如下:#[derive(Debug)]struct Point { x: i32, y: i32,}但我们从最简单的类型开始。我们知道对于简单类型来说,其值是可以copy的,所以下方代码没有任何问题:fn main() { let a = 5; let b = &a; let mut c = *b; // copy '*b' to c; So c's value is 5. c += 10; pri

2021-04-06 22:25:38 3050

原创 Rust学习笔记(9)——Option的几个方法及所有权问题

在rust的设计中,Option的设计非常巧妙,避免了其它语言中常见的Null引起的各种错误和异常。但Option与所有权的结合,尤其是在一些特定的数据结构,如链表、图等设计中,加上引用的各种约束,就使得Option的使用变得复杂起来。1、unwrap方法在确认Option不为None的情况下,可以用unwrap方法拆解出其中的值,并获取值的所有权。这里要强调的是,unwrap会消费Option本身的值,后面就不能再用了。 let a = Some(Box::new(5)); l

2021-04-06 16:43:20 8659 7

原创 Rust学习笔记(8)——连续引用的约束和限制

为了彻底弄明白所有权和引用的约束,再试试连续引用的一些特殊情况。结构体:#[derive(Debug)]struct Point { x: Box<i32>, y: Box<i32>, z: i32,}1、先看第一种一般情况,连续不可变引用,可以编译运行:fn main() { let a = Point { x: Box::new(3), y: Box::new(4), z: 5,

2021-04-02 10:47:46 541

原创 Rust学习笔记(7)——引用情况下Vec和数组中所有权的问题

关于Vec和数组中变量的所有权,以及被引用情况下的所有权,下面的代码基本涵盖了主要的场景,可编译通过,不做解释了:fn main() { let mut a = vec![Box::new(1), Box::new(2)]; let mut b = &mut a; // a[0] = Box::new(10); b[0] = Box::new(10); let c = &mut b; c[0] = Box::new(20);

2021-04-01 23:35:45 1225

原创 Rust学习笔记(6)——引用情况struct中所有权的转移问题

还是先定义struct:#[derive(Debug)]struct Point { x: Box<i32>, y: Box<i32>, z: i32,}通过可变引用,可以改变成员的值,与结构体成员为简单的i32类型一致,除了不能对Box类型使用 “+=”符号以外。fn main() { let mut a = Point { x: Box::new(3), y: Box::new(4),

2021-04-01 22:58:29 2338

原创 Rust学习笔记(5)——Vec成员的所有权

上篇文章探讨了struct的成员的所有权转移,struct允许部分成员转移所有权。那么另一个常用的类型Vec呢?是不允许的。下面代码无法编译:fn main() { let a = vec![Box::new(3), Box::new(4)]; let b = a[0];}提示如下错误:cannot move out of index of `std::vec::Vec<std::boxed::Box<i32>>`move occurs beca

2021-04-01 15:12:19 1013 2

原创 Rust学习笔记(4)——struct中所有权的转移

先定义一个struct:#[derive(Debug)]struct Point { x: Box<i32>, y: Box<i32>, z: i32,}在前面的学习中提到,struct拥有数据的所有权,并且对于实现了copy的类型,可以直接copy出去,以下代码,是可以正常编译的:fn main() { let a = Point { x: Box::new(3), y: Box::new(4),

2021-04-01 14:42:56 2725

原创 Rust学习笔记(3)——struct/vec的所有权

在struct和vec复合型数据类型中,struct和vec 默认是拥有变量的所有权的。如下代码:fn main() { let a = Box::new(1); let b = Box::new(2); let c = Point { x: a, y: b }; // let d = vec![a, b]; println!("{:?}", b); println!("{:?}", a); // println!("{:?}", d);}

2021-04-01 11:12:36 1215

原创 Rust指针学习笔记(2)——struct和Vec

一、对结构体本身的引用先定义一个简单的结构体:#[derive(Debug)]struct Point { x: i32, y: i32,}在上一篇学习中,有一个关键点,就是如果一个变量被借用以后,那么在借用结束前,该变量的值都不可改变(即使其为mut类型),这样的好处就是避免了数据竞争。同样,这点对于复合类型,如struct,也是一样。下面代码不可编译:fn main() { let mut a = Point { x: 5, y: 5 }; let

2021-03-31 23:25:07 1692 2

原创 Rust指针学习笔记(1)——简单类型

开始学习Rust的指针,在Rust中也叫借用(引用),下文是一个意思。从最简单的类型开始。所有权概念什么的,就不再这里赘述了。本系列仅为自学笔记系列,错误之处难免,若引起误会请谅解。一、不可变引用Rust中对于简单类型,如int家族,默认是进行值拷贝的,所以一般不会探讨这类指针,实际给我们带来困惑的也不是这类指针。但为了深入理解其机制,我们还是从最简单的类型开始。fn main() { let a = 5; let b = &a; println!("{:?}

2021-03-30 19:09:51 1032

原创 用Rust智能指针实现单向链表的插入删除

最近在熟悉Rust,都说链表是Rust的第一个坑,今天尝试用智能指针实现一个单向链表的常见操作:头部插入、删除,尾部插入、删除,中间插入、删除,链表反转。首先定义链表节点:#[derive(Debug)]struct Node { value: i32, next: Option<Box<Node>>,}节点方法:impl Node { fn new(value: i32) -> Box<Node> {

2021-03-29 16:22:07 863 1

原创 关于项目管理与项目经理

项目出现问题,不要病急乱投医,头痛医头脚痛医脚,盲目的投人进去,这样不仅解决不了问题,还会造成人员浪费。现在的问题,非一日之寒,积重难返,也不是再投一个人就能解决的。并且,现在已有的人并不少。 应该先系统的分析整个业务流程、组织结构、人员配备,找出问题的本质,再来看如何解决问题。

2017-12-29 14:25:18 530

空空如也

空空如也

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

TA关注的人

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