ARTS-week50

Algorithms

String Compression
思路: 指针i指向修改内容的位置,指针j遍历整个数组chars,当下一个字符与当前字符不相同时,直接将该字符赋值到i处,然后i++,j++;若相同,k指向j所在位置,j继续向前出发遍历所有与k处相同的字符,则相同的个数为j-k,将j-k转化为字符串s,将s的每一个字符都赋值在i所在位置开始的chars中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
int compress(vector<char>& chars) {
int i = 0, j = 0, n = chars.size();
while (j < n) {
if (j == n - 1 || chars[j] != chars[j + 1]) {
chars[i++] = chars[j++];
} else {
chars[i++] = chars[j];
int k = j;
while (j < n && chars[j] == chars[k]) {
j++;
}
string s = to_string(j - k);
for (char c : s) {
chars[i++] = c;
}
}
}
return i;
}
};

Find All Numbers Disappeared in an Array
思路: 将nums[i]置换到其对应的位置nums[nums[i]-1]上去,比如[4,3,2,7,8,2,3,1],其中4应该和7交换位置,以此类推,最后得到的顺序应该是[1, 2, 3, 4, 3, 2, 7, 8],最后在对应位置进行检验,如果nums[i]i+1不等,将i+1存入结果res中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
vector<int> res;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != nums[nums[i] - 1]) {
swap(nums[i], nums[nums[i] - 1]);
--i;
}
}
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != i + 1) {
res.push_back(i + 1);
}
}
return res;
}
};

Review

本周阅读英文文章:
1、Adversarial Attacks on Deep Neural Networks

2、Anonymization in Tor

3、Building a Minimal Blockchain in Python

Technique

在与CPU所处的同一芯片内设计有高速小容量内存,它们的工作就是频繁复制使用中的主存储器,代替主存储器工作,将其称为高速缓存。

高速缓存与缓存块被分区管理。块的型号因CPU的构造有所不同。主存储器与缓存,或者上层缓存与下层缓存之间的数据传送,均由块单位来执行。也就是说,当CPU想读取4字节的数据时,在缓存里没有该数据的情况下,将从外部内存复制已包含相应地址数据的块大小单位。

缓存分为三类:直接映射高速缓存、组相联高速缓存、全相联高速缓存

缓存中的数据随着程序的执行而不断更新。当缓存中没有空白块可分配时,就有必要置换出缓存中的某一块数据。常见的置换策略如下:

  • LRU(Least Recently Used):最近最少使用的数据将被置换出缓存。
  • PLRU(Pseudo-LRU):一段时间内未使用的缓存块作为替换候补,在需要替换时将某一候补替换出去。
  • FIFO(First In First Out):置换最先放入缓存的缓存块。
  • RANDOM:随机置换。

Share

分享两篇勾陈安全实验室的文章,分别对netstat和ss进行了源代码调试和原理分析:

netstat源代码调试&原理分析

ss源代码调试&原理分析

参考

https://www.liuchuo.net/archives/4285

0%