A
题目LeetCode 121 leetcode.cn/problems/be…
买卖股票的最佳时机
func maxProfit(prices []int) int {
len := len(prices)
if len == 0 {
return 0
}
dp := make([]int, len)
tmp := prices[0]
for i := 1; i < len; i++ {
tmp = min(tmp, prices[i])
dp[i] = max(dp[i - 1], prices[i] - tmp)
}
return dp[len - 1]
}
func min(a, b int) int {
if (a > b) {
return b
}
return a
}
func max(a,b int) int {
if (a > b) {
return a
}
return b
}
思路:使用动态规划 dp[i]代表前i天的最大利润,最后dp数组就是一个从小到大排列的数组,dp数组最后一个值就是最大的
其实一开始的思路是两重遍历计算获利,但是在leetcode中超时了
func maxProfit(prices []int) int {
max := 0
for i:= 0; i < len(prices); i++ {
for j:= i + 1; j < len(prices); j++ {
tmp := prices[j] - prices[i]
if tmp > max {
max = tmp
}
}
}
return max
}
R
本文讲了一个我没怎么了解过的一个概念,通过加了一行print使Go函数运行速度提高了尽一倍
func if_max (values [] int ) int {
maxV := value[ 0 ]
for _, v := range value[ 1 :] {
if v > maxV {
maxV = v
continue
}
}
return maxV
}
func if_max_lol(values []int) int {
maxV := values[0]
for _, v := range values[1:] {
if v > maxV {
maxV = v
continue
}
print("lol") // <---------- the new line
}
return maxV
}
作者通过benchstat 得出if_max_lol运行速度更快
why?
编译器会生成一条额外的分支指令,反过来调用分支预测器
分支预测(具体可以让ChatGPT解释
随后作者又测试了没有if的速度
func cheat_max (values [] int ) int {
maxV := value[ 0 ]
for _, v := range value[ 1 :] {
maxV = v
}
return maxV
}
惊奇的发现 if_max_lol和cheat_max的速度差不多,分支预测有效的消除了if语句
分支预测的性能通常会比base的性能要好
如果我们可以通过在增加一些信息诱导编译器生成分支指令也会大大提高运行速度
真是一个有意思的东西,从来没有注意过这一块
T
在业务开发中,比如前端开发过程中,应该尽量避免使用一些监听事件,没办法的情况下应该及时对事件进行移除,不然可能会造成内存泄露 example:我想对一个网页的某一个div元素在鼠标移入的时候增加切换小手图标的样式
cursor:pointer;
我一开始使用document.addEventListener进行监听进而增加样式,但是我忘记了移除这个事件,就会有内存泄露的风险
实际我们可以使用
var div = document.getElementById('div'); div.setAttribute("style", " cursor:pointer");
这样就可以更好的实现目标也避免了内存泄露
S
对于加班的看法: 我个人是不反对加班的,但是我反对无意义的加班 比如是强制必须在公司加班,即使没有事情,那我是反对的 但是如果是有事情,我觉得加班也是可以的,当然不是那种无休止的事情(这种无非就是另一种强制加班),即使没有事情也可以在公司学习补能(顺道薅羊毛),大家对于加班的看法是什么呢?可以一起讨论讨论
ARTS打卡计划