ORIGIN

去哪儿网2021秋招笔试

找工作 5 mins1.2k words

本次笔试在赛码网,有选择和编程题,这次来记录一下编程题。

图片压缩

时间限制: 3000MS
内存限制: 589824KB

题目描述:

为了降低APP图片加载内存占用,我们会对图片进行压缩。JPEG是一种十分先进的压缩技术,在编码中,有一个非常重要的步骤,即Z字形编排过程。

请将下列二维数组:

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

转换成Z字形排序:

0 1 5 6

2 4 7 12

3 8 11 13

9 10 14 15

输入描述

请将下列二维数组:

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

输出描述

转换成Z字形排序:

0 1 5 6

2 4 7 12

3 8 11 13

9 10 14 15

样例输入

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

样例输出

0 1 5 6
2 4 7 12
3 8 11 13
9 10 14 15

我的解答

针对这个测试样例我写的没问题,因为最后第一题有一行代码写错了一直没检查出来,所以一直不对所以没交上。

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
54
#include<bits/stdc++.h>

using namespace std;

int main() {
int dirs[4][2] = {0, 1, 1, -1, 1, 0, -1, 1};
int a;
vector<vector<int> > vec;
int line = 0, len = 1;
vector<int> temp;
while(cin >> a) {
temp.push_back(a);
if(cin.get() == '\n') {
vec.push_back(temp);
if(line == 0) len = temp.size();
temp.clear();
line ++;
if(line >= len) break;
}
}
cout << len << endl;

int i = 0, j = 0, oi = 0, oj = 0, dir = 0;
vector< vector<int> > ans = vec;
while(oi < len) {
ans[i][j] = vec[oi][oj];
oj ++;
if(oj >= len) {
oj = 0;
oi ++;
if(oi >= len) {
break;
}
}
i += dirs[dir][0];
j += dirs[dir][1];
if(i == 0 and dir != 0) dir = 0;
else if(i == 0 and dir == 0) dir = 1;
else if(j == 0 and dir != 2) dir = 2;
else if(j == 0 and dir == 2) dir = 3;
else if(j == len - 1 and dir != 2) dir = 2;
else if(j == len - 1 and dir == 2) dir = 1;
else if(i == len - 1 and dir != 0) dir = 0;
else if(i == len - 1 and dir == 0) dir = 3;
}
cout << "yes" << endl;
for(int a = 0; a < len; a ++) {
for(int b = 0; b < len; b ++) {
cout << ans[a][b] << " ";
}
cout << endl;
}
return 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
#include<bits/stdc++.h>

using namespace std;

int main() {
vector<int> arr;
int a;
while(cin >> a){
arr.push_back(a);
if(cin.get() == '\n') break;
}
// for(int i = 0; i < arr.size(); i ++) cout << arr[i] << endl;
long long depthNode = 1;
long long count = 0;
for(int i: arr) {
if(i != -1)
cout << i << " ";
count ++;
if(count >= depthNode) {
count = 0;
depthNode *= 2;
cout << endl;
}
}
return 0;
}

字符串反转

时间限制: 1000MS
内存限制: 65536KB

题目描述:

去哪儿网提供给用户多个目的地的出行选择,比如从“北京”到“上海”再到“武汉”。为了方便用户切换出发地和目的地,请实现一个字符串反转功能:将字符串”北京 上海 武汉”,反转成”武汉 上海 北京”。(注:不借助任何函数库)

输入描述

输入字符串:”北京 上海 武汉”

输出描述

输出字符串:”武汉 上海 北京”

样例输入

北京 上海 武汉

样例输出

武汉 上海 北京

我的解答

这个题感觉很有意思,但是测试样例中用的是中文,我想使用字符串存储,一个中文字符就得占两个char位,并且 题目没有说不能夹杂英文,所以还得考虑中英混合,前后都有空格的情况。一开始我以为只有中文,所以一直只对了一半的测试样例,后来适配中英文的就对了。

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() {
string place = "";
getline(cin, place);
stack<char> tmp;
for(int i = place.length() - 1; i >= 0;) {
if(place[i] == ' ') {
if(i != place.length() - 1) {
while(!tmp.empty()) {
char first = tmp.top();
cout << tmp.top();
tmp.pop();
if(first > 128) {
cout << tmp.top();
tmp.pop();
}
}
cout << " ";
} else i --;
while(place[i] == ' ') i --;

} else {
if(place[i] <= 128) {
tmp.push(place[i]);
i --;
continue;
}
tmp.push(place[i]);
tmp.push(place[i - 1]);
i -= 2;
}
}
while(!tmp.empty()) {
char t = tmp.top();
cout << tmp.top();
tmp.pop();
if(t > 128) {
cout << tmp.top();
tmp.pop();
}

}
return 0;
}
TOP
COMMENT
  • ABOUT
  • |
o_oyao
  The Jigsaw puzzle is incomplete with even one missing piece. And I want to be the last piece to make the puzzle complete.
Like my post?
Default QR Code
made with ❤️ by o_oyao
©o_oyao 2019-2024

|