match c{
'f' => nums.push(0),
't' => nums.push(1),
'(' => nums.push(-1),
_ => (), // 注意,必须写未匹配的部分,否则会报错。
}
栈
这个玩意,但是好在我们可以用Vec或者VecDeque模拟。 let mut vec = Vec::new(); // 创建一个无类型的vec,当第一次push后类型才会被推断出来,因此直接print会报错
let mut vec = vec![1,2,3]; // 创建一个i32的vec:[1,2,3]
let mut vec = vec![1;5]; // 创建一个长度为5的i32的vec:[1,1,1,1,1]
// vec还可以从各种集合类型里转换而来
assert_eq!(Vec::from([1, 2, 3]), vec![1, 2, 3]); // "vec_from_array", since = "1.44.0"
assert_eq!(Vec::from(&[1, 2, 3][..]), vec![1, 2, 3]); // "rust1", since = "1.0.0"
let o: Cow<[i32]> = Cow::Owned(vec![1, 2, 3]);
let b: Cow<[i32]> = Cow::Borrowed(&[1, 2, 3]);
assert_eq!(Vec::from(o), Vec::from(b)); // "vec_from_cow_slice", since = "1.14.0"
assert_eq!(Vec::from("123"), vec![b'1', b'2', b'3']); // "rust1", since = "1.0.0")
let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
assert_eq!(Vec::from(b), vec![1, 2, 3]); // "vec_from_box", since = "1.18.0"
assert_eq!(Vec::from(&mut [1, 2, 3][..]), vec![1, 2, 3]); // "vec_from_mut", since = "1.19.0")
let mut vec1 = vec![1,2,3]; // 创建一个i32的vec:[1,2,3]
vec1.push(4); // [1,2,3,4]
vec1.pop(); // [1,2,3]
let mut vec2 = Vec::from(vec1.clone()); // [1, 2, 3] 注意如果不clone会使vec1失效
// vec1.extend(vec2); // vec1:[1, 2, 3, 1, 2, 3] ,注意 本操作会导致vec2失效.since = "1.6.0"
// vec1.append(&mut vec2); // vec1:[1, 2, 3, 1, 2, 3] vec2:[];注意实参&mut,会把vec2的所有数据倒进vec1。内部调用了一个append)elements方法。 since = "1.4.0"
这个操作很明显是O(n)的,慎用。
let mut vec1 = vec![1,2,3]; // 创建一个i32的vec:[1,2,3]
vec1.insert(1,5); // [1, 5, 2, 3]
// 在尾部删除 pop/split_off
let mut vec1 = vec![1,2,3]; // 创建一个i32的vec:[1,2,3]
let p = vec1.pop(); // vec1:[1, 2], p = Some(3)
let p = vec1.pop().unwrap(); // vec1:[1], p = 2
let mut vec1 = vec![1,2,3]; // 创建一个i32的vec:[1,2,3]
let vec2 = vec1.split_off(1); // vec1:[1] vec2:[2,3],从下标1把vec1切开,返回尾巴
// 在任意位置删除 remove/swap_remove
let mut vec1 = vec![1,2,3,4]; // 创建一个i32的vec:[1,2,3,4]
let p = vec1.remove(1); // 删除下标1的元素:vec:[1,3,4],p=2
let p = vec1.swap_remove(0); // 删除下标0的元素且用4替换这个位置:vec:[4,3],p=1
impl Solution {
pub fn parse_bool_expr(expression: String) -> bool {
let mut nums = vec![0;0]; // 数字栈
let mut ops:Vec<char> = vec![]; // 运算符栈
for c in expression.chars(){
match c{
'f' => nums.push(0),
't' => nums.push(1),
'(' => nums.push(-1),
'&'|'|'|'!' => {ops.push(c)},
')' =>{
// let op = ops.pop().unwrap();
match ops.pop().unwrap() {
'!'=> {
let p = nums.pop().unwrap();
nums.pop();
nums.push(p^1);
},
'&'=>{
let mut p = 1;
let ans = loop{
let top = nums.pop().unwrap();
if top == -1{
break p;
}
p &= top;
};
nums.push(ans);
},
'|' => {
let mut p = 0;
let ans = loop{
let top = nums.pop().unwrap();
if top == -1{
break p ;
}
p |= top;
};
nums.push(ans);
},
_ =>(),
}
},
_ => (),
}
}
return nums[0] == 1;
}
}
use std::collections::*;
use rand::Rng;
struct RandomizedCollection {
d: HashMap<i32,HashSet<usize>>,
v: Vec<i32>,
}
/**
* `&self` means the method takes an immutable reference.
* If you need a mutable reference, change it to `&mut self` instead.
*/
impl RandomizedCollection {
fn new() -> Self {
Self{
d:HashMap::new(),
v:Vec::new(),
}
}
fn insert(&mut self, val: i32) -> bool {
self.v.push(val); // 插入
if !self.d.contains_key(&val) {
self.d.insert(val,HashSet::new());
}
let mut p = self.d.get_mut(&val).unwrap();
p.insert(self.v.len()-1);
// println!("{:?}",p);
p.len() == 1
}
fn remove(&mut self, val: i32) -> bool {
if !self.d.contains_key(&val){
return false;
}
let mut p = self.d.get_mut(&val).unwrap();
if p.len() == 0 {
return false;
}
let &pos = p.iter().next().unwrap();
p.remove(&pos);
// 如果是最后一个,直接移除即可
if pos == self.v.len()-1{
self.v.pop();
}
else { // 否则要把最后一个值的下标修改一下
let v = self.v.last().unwrap();
let mut pp = self.d.get_mut(&v).unwrap();
pp.remove(&(self.v.len()-1));
pp.insert(pos);
self.v.swap_remove(pos);
}
return true;
}
fn get_random(&self) -> i32 {
return self.v[rand::thread_rng().gen_range(0, self.v.len())]
}
}
/**
* Your RandomizedCollection object will be instantiated and called as such:
* let obj = RandomizedCollection::new();
* let ret_1: bool = obj.insert(val);
* let ret_2: bool = obj.remove(val);
* let ret_3: i32 = obj.get_random();
*/