我发现勇气根本靠不住,只有完全的疯狂才有意义。
写这篇文章时,九月画下句号,十月刚刚起笔。回忆这一个月,无数的片段涌上心头,诉说着它们的故事,有焦虑、有等待、有充实、有恐惧、有喜悦,但没有迷茫。从初中刚开始学编程的那一刻起,对大厂的渴望或许便铭刻在了我的心上。上大学以来,我越发觉得我接受不了小厂,剑指BAT,从没改变,(梦想当然是 Google),这个九月,我终于如愿了。
阅读全文 »

在地平线面试时和面试官聊到进程和线程的区别,自己说到线程切换要比进程切换快,面试官问到具体是为什么。

orz,无奈自己没有好好学操作系统,也没有复习这个。

面试官非常 nice,告诉我是因为有关 CPU 的缓存问题,其关键是 TLB。

线程共享资源:

a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此 new 出来的都是共享的(16 位平台上分全局堆和局部堆,局部堆是独享的)

b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的

c. 静态变量 虽然对于局部变量来说,它在代码中是 “放” 在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss 和.data 段,是共享的

d. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。

e. 地址空间

f. 子进程、闹铃、信号及信号服务程序、记账信息

g. 进程代码段

线程独享资源

寄存器

程序计数器

状态字

线程优先级

错误返回码

请带着批判的眼光看这篇文章。或许我的一些答案是不对的。如果您发现了错误,烦请指出。
1. C++对象模型

这个要重点掌握, 要明白类里有什么,每个类的对象里又有什么。尤其是对虚函数表的了解。这块知识较多,不在这篇文章中详述。网上有着很多优秀的博客来介绍。

https://coolshell.cn/articles/12176.html

https://www.jianshu.com/p/9fb37bb3094f

  1. C++ 多态机制的实现原理

    主要就是上面问题中的虚函数表。

  2. 如果一个类的指针为 nullptr ,那么调用他的成员函数会不会出错。出错的话是在哪一阶段出错。

    也是对 C++ 内存模型的一个考察以及动态绑定静态绑定。每个类的成员函数都在.text 代码段,静态绑定的时候如果成员函数不访问成员变量的话那么这个函数不会出问题。如果说是虚函数或这个函数访问了成员变量,那么就会出错。虚函数出错是因为其动态绑定,因为是 nullptr, 无法确定其虚函数表。

    阅读全文 »

今天做题的时候遇到这样一个问题。

以下程序片段输出内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Demo {
public:
Demo():count(0) {}
~Demo() {}

void say(const std::string&msg) {
fprintf(stderr,"%s\n", msg.c_str());
}
private:
int count;
};

int main(int argc, char **argv) {
Demo* v = NULL;
v->say("hello world");
}
阅读全文 »

突然想起小伙伴前段时间给我看的一段神仙代码。实在特有诱惑力了。。当时女票喊我吃饭我都在看这段代码,话不多说,放码过来。

1
printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);

要解开这道题,我们首先要知道下面几点。

  • a[3] == 3[a]
    转换为指针角度看, a[3] = *(a+3) = *(3+a) = 3[a]
  • "abcdefg"[3] 这种表示相当于 char str[]="abcdefg"; str[3]
  • 知道了上面那点后,我的目光就聚焦在 unix 上,我感觉它应该是一个数字,一开始以为它是个变量,但代码中没有描述,我问小伙伴这是不是全量代码,小伙伴说文章里没有看到其他的。。于是我就开始猜他的值,一开始猜的 3,是因为忘记了字符串中 “\0xx” 的意义,把他们当成了 3 个字符来看。其实它们是一个字符的,这种格式表示八进制的 ASCII 码。然后猜 unix 值为 1,后面才晓得 unix 是个宏定义, #define unix 1,这样,我们可以将上面的题目转换成较易看懂的。
1
printf( &("\021%six\012\0"[1]), "have"[1]+"fun"-0x60);

众所周知, printf() 的第一个参数为字符串,或者说字符串的起始地址,我们分析后可知为 %six\012\0, '%s' 表示一个字符串,故我们看第 2 个参数, have[1] 也便是 'a''a'-0x60 = 97 - 96 = 1, "fun"+1 也便是字符串 "un" 的起始地址,\012 = 10, 对应 ASCII 码也便是 \n

所以这段代码其实是 printf("unix\n");

unix

很棒很惊艳的代码。

阅读全文 »

***** /usr/local/run.sh 中 5 个 * 分别代表什么
答案:分钟 小时 日 月 星期几

牛客用户 进击的渣渣兔 的答案:

吃货速记:分食日月粥

Problem

time limit per test : 2 seconds
memory limit per test : 256 megabytes
input : standard input
output : standard output

Description

Alice and Bob play a game. There is a paper strip which is divided into n + 1 cells numbered from left to right starting from 0. There is a chip placed in the n-th cell (the last one).

Players take turns, Alice is first. Each player during his or her turn has to move the chip 1, 2 or k cells to the left (so, if the chip is currently in the cell i, the player can move it into cell i - 1, i - 2 or i - k). The chip should not leave the borders of the paper strip: it is impossible, for example, to move it k cells to the left if the current cell has number i < k. The player who can’t make a move loses the game.

Who wins if both participants play optimally?

Alice and Bob would like to play several games, so you should determine the winner in each game.

Input

The first line contains the single integer T (1 ≤ T ≤ 100) — the number of games. Next T lines contain one game per line. All games are independent.

Each of the next T lines contains two integers n and k (0 ≤ n ≤ 109, 3 ≤ k ≤ 109) — the length of the strip and the constant denoting the third move, respectively.

Output

For each game, print Alice if Alice wins this game and Bob otherwise.

Example

input

1
2
3
4
5
4
0 3
3 3
3 4
4 4

output

1
2
3
4
Bob
Alice
Bob
Alice

Solution

Idea

打表找规律,存在循环。

发现若 k 不为 3 的倍数,则循环节长度为 3 。若 k 为 3 的倍数, 循环节长度为 k+1, 循环节内也有一定的规律。

Problem

time limit per test : 2 seconds
memory limit per test : 256 megabytes
input : standard input
output : standard output

Description

You are given a picture consisting of $nn$ rows and $m$ columns. Rows are numbered from $1$ to $n$ from the top to the bottom, columns are numbered from $1$ to $m$ from the left to the right. Each cell is painted either black or white.

You think that this picture is not interesting enough. You consider a picture to be interesting if there is at least one cross in it. A cross is represented by a pair of numbers $x$ and $y$ , where $1≤x≤n$ and $1≤y≤m$, such that all cells in row $x$ and all cells in column $y$ are painted black.

For examples, each of these pictures contain crosses:

img

The fourth picture contains 4 crosses: at $(1,3)$ , (1,5)(1,5), $(3,3)$ and $(3,5)$ .

Following images don’t contain crosses:

img

You have a brush and a can of black paint, so you can make this picture interesting. Each minute you may choose a white cell and paint it black.

What is the minimum number of minutes you have to spend so the resulting picture contains at least one cross?

You are also asked to answer multiple independent queries.

阅读全文 »

Linux 内核源码果真精髓,相见恨晚。

offsetof 宏定义如下

1
#define offsetof(type, member) (size_t)&(((type*)0)->member)

container_of 宏定义如下

1
2
3
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
0%