rust8.slice
1234567891011fn main(){ let s = String::from("hello world"); let h = &s[0..5]; let h =&s[0..=4]; let h = &s[..=4]; let h = &s[..5]; println!("h= {}",h); }
rust7.所有权
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556//rust 使用所有权机制管理内存,在编译过程中编译器会根据所有权规则对内存使用进行检查//堆和栈//编译过程中数据大小固定在栈上分配//编译过程中数据大小不固定分配在栈上//作用域//String内存回收//移动//clone//栈上数据拷贝//函数和作用域//指针在栈中,指针指向的值在堆中fn main(){ let x :i32 = 1;//栈 { let y :i32 = 1; println!("x = {}",x); println!("y = {}",y); } //脱离作用域 //println!("y = {}",y); // //这些方法均为堆上数据拷贝 { let ...
rust6.控制流
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970fn main() { let y = 1; //if if y == 1 { println!("y = 1 "); } //if - else if y == 1 { println!("y == {}",y); } else { println!("y != 1"); } // if -else if - else if y == 1 {println! ("y = 1");} else if y == 2 { println!("y = 2"); ...
rust5.语句
语句和表达式
1234567891011//语句用来执行一些操作,不返回值的指令let y = 1;//不返回值//下面这段代码在C语言中成立,但是在Rust中报错。//let x = (let y = 1);//表达式会计算一些值let y = { let x = 1; // x + 1; //报错 x + 1 };
rust4.函数
函数的三种类型
有参数有返回值
有参数无返回值
无参数无返回值
123456789101112131415161718192021222324fn other_fun() { println!("This is a function"); }fn other_fun1 (a: i32, b: u32) { println!("a = {} , b = {}" , a,b); }fn other_fun2 (a :i32 , b: i32 ) -> i32 { let result = a + b; //c语言常用这种写法返回,但是Rust使用下面的写法较多 //return result; result//或者直接使用a+b也可以 }fn main() { other_fun(); let a: i32 = -1; let b: u32 = 20; let c: ...
rust2.数据类型
Rust中变量和函数命名方法是蛇形命名法(小写字母加下划线),而在类和常量一般为首字母大写或者是大写字母。
基本数据类型
12345678910111213141516171819202122//布尔类型let is_bool: bool = true;let is_false = false;//char字符,这个字符的大小是32位//32位字符大小是因为不仅仅是包括ASCII码,他是一种基本的unicode类型let a = 'a';let b = '你';let c = '🐈';//数字类型//i8,i16,i32,i64,u8,u16,u32,u64,f32,f64let c: i8 = -111;// -128 ~ 127//默认整形长度为i32,浮点型为f64let d: f32 = 0.0009;//自适应类型//长度随着计算机平台不同而变化,如指针在16位平台上是16位//主要是isize,usizeprintln!("max = {}",usize::max_val ...
rust1.变量和常量
常量
在函数体外部使用:
1const Max_POINTS: u32 = 10000;
变量
1234567891011121314fn main(){//let name : typelet a = 1;//自动判断数据类型//相当于let a: u32 = 1;//mut关键字可以改变变量let mut b : u32 = 1;b = 2;//隐藏//同一函数体中同名变量会替换之前的变量let b : f32 = 1.1;}
leetcode--3.无重复字符的最长字串
滑窗解决问题
没有重复的最大字串是在出现第二个和首字符相同的字符的情况之下出现断开
而这种情况之下可以选择使用滑块方法解决:
第k个字符作为起始位置,到rk结束
第k+1个字符开始,到rk的时候,此时是不重复的,所以可以将rk值进行增大,直到和k+1个字符相等。
查看代码
1234567891011121314151617181920212223use std::collections::HashSet;impl Solution { pub fn length_of_longest_substring(s: String) -> i32 { let mut occ: HashSet<char> = HashSet::new(); let cv: Vec<char> = s.chars().collect(); let n = s.len(); let mut rk = 0; let mut ans = 0; for i in 0..n{ ...
leetcode第二题两数相加
leetcode第二题两数相加
这道题目的解决方法是使用两数相加中的初等数学,利用两个数,两个数的进位这总共三个变量来进行判断
可以设置一个元组tuple,分别记录这几个数的状态,一般的状态有以下几种:
两数都为None,没有进位->此时直接退出
两数为None,有进位(这个进位是上一阶段的链表所进的位数) -> 此时结果为进位
两个链表有一个此刻为None,根据进位状态又可以分为:
有进位,将链表值和进位相加,如果大于等于10,则结果产生新的进位,这个阶段的值为list.val+carry-10。
没有进位,将链表值和进位相加,值为list.val+carry
两个链表都存在,结果和上一阶段类似
最后将返回的值进行递进。
查看代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445// Definition for singly-linked list.#[derive(PartialEq, Eq, Clone, Debug)]pub st ...
Rust迭代器
Iterator
Iter和for循环
Rust中调用迭代器的接口就是Iterator,通常情况之下看到的for循环 就是这种迭代器的语法糖。
这种for循环使用into_iter()在T上迭代。
1234trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>;}
通常情况之下,使用for循环会消耗这个集合,因为使用了into_iter()方法,但是实际上可以使用其他方法,如:
查看
12345678let mut values = vec![41];for x in values.iter_mut() { *x += 1;}for x in values.iter() { assert_eq!(*x, 42);}assert_eq!(values.len(), 1); // `values` 仍然属于此函数。
或者下面的:
12345678let mut values = vec! ...