深信服

[TOC]

深信服笔试

考察golang语法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
	"fmt"
)

func Add(list []int, e int) {
	_ = append(list, e)
}
func main() {
	var list []int
	Add(list, 1)
	list = append(list, 21)
	fmt.Println(list)

}
/*
PS D:\ASUS\Desktop\temp\golang学习\client> go run .\example.go
[21]
PS D:
只会打印 21
*/

考察引用传递和数组传递

 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
package main

import (
	"fmt"
)

//list1 是 切片,所以是引用
//list2 是数组,所以是全值
func main() {
	var list1 []int = []int{2, 1}
	var list2 [10]int
	c := list1
	d := list2
	c[0] = 99
	d[0] = 99
	fmt.Println(list1)
	fmt.Println(list2)
}
/*
PS D:\ASUS\Desktop\temp\golang学习\client> go run .\example.go
[99 1]
[0 0 0 0 0 0 0 0 0 0]


*/

一面

golang等待其他协程执行完成

golang 等待一组协程退出

问我要用到哪些包

sync/atomic , time, sync

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import (
    "log"
    "sync"
    "sync/atomic"
    "time"
)
func main() {
    wg := sync.WaitGroup{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            log.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import (
    "log"
    "time"
)
 
func main() {
    ch := make(chan struct{}, 10)
    var i int
    for i = 0; i < 10; i++ {
        go func(i int) {
            log.Println(i)
            ch <- struct{}{}
        }(i)
    }
 
    for j := i; j > 0; j-- {
        <-ch
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main
 
import (
   "log"
   "time"
)
 
func main() {
   ch := make(chan struct{})
   for i := 0; i < 10; i++ {
      go func(i int) {
         log.Println(i)
         ch <- struct{}{}
      }(i)
      <-ch
   }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package main
 
import (
   "log"
   "time"
   "sync"
   "sync/atomic"
)
 
func main() {
   var total int32
   for  i := 0; i < 10; i++ {
      go func(i int) {
         log.Println(i)
         atomic.AddInt32(&total,1)
      }(i)
   }
   for atomic.LoadInt32(&total) < 10 {
      time.Sleep(time.Microsecond)
   }
}

golang G-M-P 模型

面试官: 聊聊 golang 的 GMP 模型

我: 不会。。

面试官: 你java 学的多一点吧? 问几个 java的问题吧。

https://img-blog.csdnimg.cn/20200330210355555.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaXhpYW9zaGk=,size_16,color_FFFFFF,t_70

G:Goroutine M: OS Thread P:抽象概念(Processor),类似cpu的作用,将G调度到M上,进行绑定 所有的 P 都在程序启动时创建,并保存在数组中,最多有 GOMAXPROCS(可配置) 个

b站找到的学习教程

java 的 地址比较

1
2
3
4
5
6
7
8
@Test
void printIt() {
    Double i1 = 1.0;
    Double i2 = 1.0;
    Double i3 = 1.0;
    System.out.println(i1 == i2);
    System.out.println(i1 == i3);
}

答案全部都是 false,全部比较地址,并且没有 Integer那种 对象池

自增的一些原理

1
2
3
4
5
6
7
@Test
	void printIt() {
		short i = 1;
		i+=1;
		i = (short)(i+1);
		 
	}

i+=1 会自动转型, i = i+1 ,就要手动向下转型。

学了这么久,都没意识到这个

实现最小栈

算法题:数组 sum 等于0 的元素

 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
#include<bits/stdc++.h>
using namespace std;

int main(void) {
    vector<int> v= {-1, 0, 1, 2,2,1,1,2,2,4,6, -1, -4};
    sort(v.begin(),v.end());
    vector<vector<int>>res;
    int n = v.size();
    int pre1 = -7777;
    int pre2 = -9999;

    for(int i=0;i<n;i++) {
        int j = i+1, r = n-1;

        while(j<r) {
            int a= v[i],b = v[j] , c= v[r];


            int sum = a+b+c;

            if(res.size()   && pre1==a && pre2 == b && sum == 0){
                ++j;
                continue;
            }

            if(sum == 0) {
                pre1 = a;
                pre2 = b;
                ++j;
                res.push_back({a,b,c});

            }else if(sum > 0) {
                --r;
            }else {
                ++j;
            }

        }

    }

    for(int i=0;i<res.size();++i) {
        cout << res[i][0] <<" " << res[i][1]<<" " << res[i][2] <<endl;
    }


}