0%

题目

给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

1
2
3
4
输入: prices = [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
  随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

1
2
3
4
输入: prices = [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
  注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

1
2
3
输入: prices = [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1
2
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 贪心算法
* @param prices
* @returns
*/
function maxProfit(prices: number[]): number {
let i = 0;
prices.reduce((current, next) => {
let val = next - current;
i += val > 0 ? val : 0;
return next;
});
return i;
}

参考

题目

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

1
2
3
4
5
6
7
8
9

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 1:

1
2
3
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

1
2
3
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

1
2
3
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列

个人题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 个人题解
* 双层遍历的解法,时间复杂度O(n2)
* @param nums
* @returns
*/
function removeDuplicates(nums: number[]): number {
for (let i = 0; i < nums.length; ) {
let index = nums.findIndex((cItem, cIndex) => i !== cIndex && nums[i] === cItem);
if (index !== -1) {
nums.splice(i, 1);
continue;
}
i++;
}
return nums.length;
}

双指针解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

/**

* @param nums
* @returns
*/
function removeDuplicates(nums: number[]): number {
let left = 0;
for (let right = 1; right < nums.length; right++) {
if (nums[left] !== nums[right]) {
nums[++left] = nums[right];
}
}
return left + 1;
}
  • 看了题解,双指针办法
  • 因为数组是有序的,右边大于等于左边
  • 初始化左指针等于0,右指针等于1,
  • 循环右指针
  • 当右指针不等于左指针的时候,说明碰到了不一样的数值,将右指针赋值给左指针,左指向前移动一位,右指针继续循环
  • 不重复的值为左指针+1

参考链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use ::std::io;
fn main() {
let mut n = String::new();
io::stdin().read_line(&mut n).expect("输入错误");
let n: i64 = n.trim().parse().expect("不是数字");
let mut index = 0;
let mut first = 0;
let mut second = 1;
while index <= n {
if index == 0 || index == 1 {
println!("count {}", index);
} else {
let count: i64 = first + second;
first = second;
second = count;
println!("count {}", count);
}
index += 1;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn main() {
println!("猜一个数字!");
println!("输出你猜的数字");
let secret_number = rand::thread_rng().gen_range(1, 101);
loop {
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("读取错误");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("请输入数字");
continue;
}
};
match guess.cmp(&secret_number) {
Ordering::Less => println!("小了"),
Ordering::Greater => println!("大了"),
Ordering::Equal => {
println!("对了");
break;
}
}
}
}

看到十年前自己写的一些东西,光阴似箭啊。。
一转眼十几年过去了。
好像自己从来没做出过什么emm 不知道该怎么形容。。
没有什么特别出彩的东西?
可能是吧。

感觉浪费了很多时间,但是又没有毅力去改变。。
可怕的就是这种情况吧。

也许可以定一个目标,做点什么东西,在这个世界留下点什么东西。
emmm,如果可以,我想这个东西会是好的。

思绪有点乱。

也有可能。。
emm 大概率。。
碌碌无为一生。

上班,结婚,生子。

快三十了呀。

2008年。。

你觉得很重要的事情。。
可能在大部分人看来。。em 也许都记不住。
人总是渺小的

要做点什么。

随便谢谢,记录一下。

多年以后在看,也许有不一样的感觉。

JS-MAP问题

发现问题

  • 定义了一个MAP,代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    const QuestuibOptionHandlerMap = new Map([
    [0, getCommonOptions], //单选题
    [1, getCommonOptions], //多选题
    [2, () => {}], //填空题
    [3, getCommonOptions], //下拉题
    [4, () => {}], //日期
    [5, () => {}], //量表题
    [6, () => {}], //AHP 题组
    [7, () => {}], //图片上传题
    [8, () => {}], //文件上传题
    [9, () => {}], //城市
    [1, () => {}], //车型
    ]);
  • 输出MAP

    1
    console.log(QuestuibOptionHandlerMap);

    20210115173433
    然后输出的……..

解决问题.

以后多动动脑子,求你了.
卧槽啊啊啊啊啊啊!!!!!!
第二个,跟最后一个竟然重复了!!!!!!!!!
改行吧

Array.prototype.sort在不同的宿主环境,不同版本,排序方式会不同.

由于开发版本为nodev12,生产版本为nodev10,写了一个sort方法,两份代码,同样的数据,同样的代码内容.排序的内容确不一样.
v8引改变了sort方法的排序方式,导致两个版本排序的结果不一样.
最后使用lodash的orderby方法解决.
其实可以考虑自己写排序.后来感觉太麻烦了…
啊!!!我一定要把生产环境的node升级了!!!!!

笨啊 卧槽

全等号写成了等于号…
我真是个人才…
找bug找了一个小时才发现哪里写错了…
别写bug了,回家养猪吧.

记一次nuxt引入videojs排查问题经历

发现问题

开发的项目是基于nuxt框架,项目中需要使用videojs,在开发阶段没有问题,使用与样式展示都没有问题.

在打包之后运行,发现videojs的样式不能正确展示.样式错误,发现样式没有被打包.

解决问题(阶段1)

发现nuxt.config.js里面有一个配置extractCSS是用来提取css的,把css提取到一个文件里面,把这个配置设置为false就可以解决这个问题.

但是有了新的问题,因为没有提取css,nuxt在服务端渲染的时候,会把所有的样式在html页面返回,导致html的文件比较大.

当时花了一些时间,只找到这个解决办法,而且项目比较赶,暂时这样解决

解决问题(阶段2)

网页需要seo,因为样式全在html里面,不相关内容太多,权重比较低.seo大佬建议去掉这些样式.

找了好久,发现是因为用了tailwindcss这个ui框架,tailwindcss建议使用purgecss这个库来去除不需要的css,不然打包后的文件会比较大.

videojs是在客户端使用js动态添加的class,导致purgecss匹配不到这些样式.所以就从打包后的css内删除.导致样式展示错误.

去看官方文档,看到有一个safelist可以保留这些样式于是在nuxt.config.js内增加如下代码

1
2
3
4
5
6
7
export default {
// ...
purgeCSS:{
safelist: [/vjs/, /video/]
}
//...
}

发现不起作用,各种尝试,safelist.deep,safelist.standard属性,不使用正则等…还是不行,直到看到了一个tip

20201111164002

对比了一下自己的安装的依赖,发现nuxt使用的是老版本的purgecss,找到的相关的配置,代码如下.

1
2
3
4
5
6
7
8
export default {
// ...
purgeCSS: {
whitelistPatterns: [/vjs/, /video/],
whitelistPatternsChildren: [/vjs/, /video/]
},
//...
}

问题解决.

总结

  • 使用tailwindcss样式库,而且用到purgecss这个插件,要注意打包过后的样式是否正确,这个插件会删除不用的css(就是在页面中,没有匹配到相应的class名).
  • 在如上前提下,出现新引入的框架样式展示不正确,考虑在nuxt.config.js里面添加相应的配置.
  • purgecss 3.0版本以上添加
    1
    2
    3
    4
    5
    6
    7
    export default {
    // ...
    purgeCSS:{
    safelist: [/vjs/, /video/]
    }
    //...
    }
  • purgecss 2.x 版本添加
    1
    2
    3
    4
    5
    6
    7
    8
    export default {
    // ...
    purgeCSS: {
    whitelistPatterns: [/vjs/, /video/],
    whitelistPatternsChildren: [/vjs/, /video/]
    },
    //...
    }
  • 发现问题要及时解决.不能有 又不是不能用 这个心态…55555.

参考文档