Contents

ARST打卡第288周

lc3242_设计相邻元素求和服务 女性愤怒的力量【TED演讲】 实时资讯热榜聚合网站 WSL安装配置Centos7开发环境

Algorithm

lc3242_设计相邻元素求和服务

思路:

这个题目主要看数据范围,如果查询次数量级大,就预处理,查询时查表; 如果查询次数少,就不用预处理,每次实时计算。

但显然这种题一般是要多次查询的,所以还是预处理+查表。

但是做完发现这题居然是查询次数小于预处理次数,有点离谱…

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
struct NeighborSum {
    // 由于0到n^2的数字不重复,所以可以用一个二维数组来存储每个数字的相邻元素和和对角线元素和,而不用map
    adjacent_sum: Vec<i32>,
    diagonal_sum: Vec<i32>,
}

impl NeighborSum {

    fn new(grid: Vec<Vec<i32>>) -> Self {
        // 预处理, 计算每个元素的相邻元素和 和 对角线元素和
        let n = grid.len();
        let mut adjacent_sum = vec![0; n * n];
        let mut diagonal_sum = vec![0; n * n];
        // 建立上下左右偏移数组,方便计算
        let offset = vec![(0, 1), (0, -1), (1, 0), (-1, 0)];
        // 对角线偏移数组  
        let diagonal_offset = vec![(1, 1), (1, -1), (-1, 1), (-1, -1)];
        for i in 0..n {
            for j in 0..n {
                // **当前元素的值作为结果索引key**, 然后计算相邻元素和和对角线元素和作为 value
                let index = grid[i][j] as usize;
                adjacent_sum[index] = 0;
                diagonal_sum[index] = 0;
                for &(dx, dy) in &offset {
                    let x = i as i32 + dx;
                    let y = j as i32 + dy;
                    if x >= 0 && x < n as i32 && y >= 0 && y < n as i32 {
                        adjacent_sum[index] += grid[x as usize][y as usize];
                    }
                }
                for &(dx, dy) in &diagonal_offset {
                    let x = i as i32 + dx;
                    let y = j as i32 + dy; 
                    if x >= 0 && x < n as i32 && y >= 0 && y < n as i32 {
                        diagonal_sum[index] += grid[x as usize][y as usize];
                    }
                }
            }
        }
        Self {
            adjacent_sum,
            diagonal_sum,
        }
    }
    
    fn adjacent_sum(&self, value: i32) -> i32 {
        self.adjacent_sum[value as usize]
    }
    
    fn diagonal_sum(&self, value: i32) -> i32 {
        self.diagonal_sum[value as usize]
    }
}

发现题解只记录了值的位置,然后查表的时候再实时计算…

个人的解法是直接预处理时就把值作为key,然后计算相邻元素和和对角线元素和作为value。最终直接查表,不用记录位置。

因为查询最多只有 2*n^2 次,所以没必要预处理,预处理直接把 2*n^2 计算做完了,所以其实题解的选择是对的。

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::collections::HashMap;

const dirs: [ &[(i32, i32)]; 2] = [
    &[(-1, 0), (1, 0), (0, -1), (0, 1)],   
    &[(-1, -1), (-1, 1), (1, -1), (1, 1)],
];

struct NeighborSum {
    grid: Vec<Vec<i32>>,
    pos: HashMap<i32, (usize, usize)>,
}

impl NeighborSum {

    fn new(grid: Vec<Vec<i32>>) -> Self {
        let mut pos = HashMap::new();
        for (i, row) in grid.iter().enumerate() {
            for (j, &val) in row.iter().enumerate() {
                pos.insert(val, (i, j));
            }
        }
        NeighborSum { grid, pos }
    }
    
    fn adjacent_sum(&self, value: i32) -> i32 {
        self.get_sum(value, 0)
    }
    
    fn diagonal_sum(&self, value: i32) -> i32 {
        self.get_sum(value, 1)
    }

    fn get_sum(&self, value: i32, idx: usize) -> i32 {
        if let Some(&(x, y)) = self.pos.get(&value) {
            let mut sum = 0;
            for &(dx, dy) in dirs[idx] {
                let nx = x as i32 + dx;
                let ny = y as i32 + dy;
                if nx >= 0 && (nx as usize) < self.grid.len() && ny >= 0 && (ny as usize) < self.grid[0].len() {
                    sum += self.grid[nx as usize][ny as usize];
                }
            }
            sum
        } else {
            0
        }
    }
}

// 链接:https://leetcode.cn/problems/design-neighbor-sum-service/solutions/2977803/she-ji-xiang-lin-yuan-su-qiu-he-fu-wu-by-po0u/

Review

女性愤怒的力量【TED演讲】

愤怒是一种强烈的情感——它警示着威胁,暴力,侮辱和伤害。作家索瑞雅·坎梅拉表示,放眼全球,女孩们和女人们都被教导说,她们的愤怒最好保持沉默。为什么呢?在沉默中我们会失去什么呢?在一次发人深省的演讲者中,坎梅拉探讨了愤怒不为女性气质这一危险谎言,表明女性的愤怒是合理的、健康的,并是潜在的变革催化剂。

当女性的愤怒被认真对待时,那么会是一个认真对待女性而且更男女平权的世界。

Tips

实时资讯热榜聚合网站

Share-WSL安装配置Centos7开发环境

背景

  1. 许多公司线上机无法访问外网(golang编译麻烦)
  2. Ubuntu18.04/Ubuntu22.04(libc2.32/libc2.27)编译的的的一些动态库无法在 glibc2.17 的线上机器上运行。

因此考虑装一个 Centos7 的 WSL。

Centos7 的 WSL 两个好处:

  1. 可以访问外网,安装 golang 很方便。(这里 WSL ubuntu 也可以,但是 ubuntu 的 glibc 版本太高)
  2. 让编译的动态库文件符合线上的 glibc 版本。(线上也是 Centos7, 只能使用 glibc2.17 版本的动态库和依赖库)

安装WSL_Centos7

参考:

由于没有 Centos7.4 版本,所以只能安装 Centos7.9 版本。

注意点:

  1. 解压放在一个目录夹里
  2. 双击 exe 安装完成 wsl --list 查看是否安装成功, wsl -d CentOS7 进入系统
1
2
3
4
5
6
ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

确定是 glibc2.17 版本。舒服了。

Terminal 配置

复制 Ubuntu22 的 Terminal 配置,然后改启动脚本为 C:\Windows\system32\wsl.exe -d CentOS7

CentOS7 基础配置

配置 yum 源

1
2
3
4
5
6
7
# 优先使用阿里云的源,不容易出问题,并且不容易有依赖报错
# 下载官方源 阿里云镜像很舒服
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 更新缓存
yum clean all
yum makecache

安装基础软件

安装 git , vim, curl, wget, net-tools, gcc, gcc-c++, make

1
2
3
4
5
6
7
8
yum install -y git vim curl wget net-tools gcc gcc-c++ make


> gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

wsl设置主机名

1
2
3
4
5
6
7
[root@yourHost ~]# cat /etc/wsl.conf
[network]
hostname=c7d

[boot]
systemd=true
# 然后关掉这个终端重开一个新终端就有新的wsl主机名了  centos7_dev -> c7d

配置 ssh

 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
# 安装ssh服务
yum install -y openssh-server

# 启动ssh服务
systemctl start sshd
systemctl enable sshd

# 生成ssh密钥对
ssh-keygen -t rsa -b 4096 -C "yourName@xxx.com" -f ~/.ssh/xxx_id_rsa

# 配置ssh config文件
cat > ~/.ssh/config << EOF
Host gitlab.xxx.xyz
        HostName gitlab.xxx.xyz
        User root
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/xxx_id_rsa
EOF


# 查看公钥,添加到gitlab
cat ~/.ssh/xxx_id_rsa.pub

# 测试连接
ssh -T git@gitlab.xxx.xyz

安装开发软件

安装 golang

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 安装golang
mkdir download
cd download/
wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz

# 解压到指定目录
sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
# 把这个加到 .profile 或者 .bashrc 中
export PATH=$PATH:/usr/local/go/bin
source ~/.profile 
# or
source ~/.bashrc
# 记得把 ~/.bashrc 里面的一些 PATH 配置移动到 ~/.zshrc 中
source ~/.zshrc

go version
go version go1.23.3 linux/amd64
which go
/usr/local/go/bin/go

安装oh-my-zsh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 安装zsh
yum install -y zsh

# 需要先把 zsh 加入到 /etc/shells 中, 默认只加入的 /bin/zsh. 但是没有加 /usr/bin/zsh
echo `which zsh` >> /etc/shells

# 然后再修改默认 shell
chsh -s `which zsh` root

# 安装oh-my-zsh
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

p10k安装配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

vim ~/.zshrc
ZSH_THEME="powerlevel10k/powerlevel10k"

# 发现 zsh 版本太低,无法使用 p10k,需要升级
# 添加 zsh 源
yum remove -y zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/romkatv/zsh-bin/master/install)"
# 安装过程就要配置了
# 然后重新zsh进入配置
zsh

# source 之后就可以开始配置 p10k 了
source ~/.zshrc

# ** 记得把 ~/.bashrc 里面的一些 PATH 配置移动过来 **

# 后续可以反复修改
p10k configure

cursor连接wsl失败

1
2
3
4
[2024-11-07 07:36:01.063] wsl:hKm0R localhostNtMn
                                                      FO*g\P0R WSL0NAT !j_
N/ec localhostNt0                                                          Nv WSL 
[2024-11-07 07:36:01.064] <3>WSL (13061) ERROR: CreateProcessCommon:559: execvpe(/usr/bin/zsh) failed: No such file or directory

这里是安装 zsh 用的 github 链接下载到的时 /usr/local/bin/zsh,导致的问题,软连接一下就行。

1
ln -s /usr/local/bin/zsh /usr/bin/zsh

然后就能正常连接 cursor 了,虽然说未来不支持低版本的 glibc,但是目前还能用。嗯嗯。