华为20190410春招实习⽣笔试题
前两题⽐较基础,第三题也不是很难,刚做完,记录⼀下,04/13更新第三题做法
————————————————————————————————
第⼀题:
输⼊的字符串超过8个字符的,按8个截⼀段,最后不⾜8个的补0到8个
最后将重新得到的字符串按升序排列
输⼊描述:输⼊⼀个数字N ,N个字符串,中间以空格隔开
输出描述:排序后的字符串
例:输⼊:2  abc 123456789    输出: 12345678 90000000 abc00000
1 #include<iostream>
2 #include<string>
3 #include<vector>
4
5using namespace std;
6
7int main() {
8int num;
9while (cin >> num)
10    {
11//vector<string> str_array;
12        vector<string> str_array_new;
13for (int i = 0; i < num; i++) {
14string str;
15            cin >> str;
16//str_array.push_back(str);
17while (str.length() > 8)
18            {
19string str_temp(str.begin(), str.begin() + 8);
20                str_array_new.push_back(str_temp);
21                ase(str.begin(),str.begin() + 8);
22            }
23while (str.length() < 8)
24            {
25                str.push_back('0');
26            }
27            str_array_new.push_back(str);
28        }
29int length = str_array_new.size();
30for (int i = 0;  i < length; i++)
31        {
32for (int j = i + 1 ; j < length; j++)
33            {
34if (str_array_new[j][0] < str_array_new[i][0]) {
35string temp = str_array_new[i];
36                    str_array_new[i] = str_array_new[j];
37                    str_array_new[j] = temp;
38                }
39            }
40        }
41for (int i = 0; i < length; i++)
42        {
43            cout << str_array_new[i] << '';
44        }
45        cout << endl;
46    }
47
48    system("pause");
49return0;
50 }
第⼆题:
题⽬描述:输⼊⼀个字符串,含有括号(⼤括号,⼩括号,中括号),数字和字母,数字(n)之后必跟⼀个括号(测试⽤例⾥的括号都是匹配的),代表括号内的字符串重复(n)次。括号⾥可以有嵌套,即括号⾥含有括号。现在将输⼊的字符串逆序展开;
输⼊描述:字符串,例:abc3(A)
输出描述:字符串,例:AAAcba
1 #include<iostream>
2 #include<string>
3 #include<vector>
4 #include<algorithm>
5
6using namespace  std;
7
8int have_kuohao(string str) {
9for (int i = 0; i < str.length(); i++)
10    {
11if (str[i] == '(' || str[i] == '[' || str[i] == '{')
12        {
13return1;
14        }
15
16    }
17return0;
18 }
19int main()
20 {
21string str;
22while (cin >> str)
23    {
24//括号嵌套问题
25//没有括号直接输出
26if (have_kuohao(str) == 0)
27        {
28            reverse(str.begin(),d());
29            cout << str << endl;
30continue;
31        }
32else
33        {
34//
35while (have_kuohao(str))
36            {
37int left;
38int right;
39for (int i = 0; i < str.length(); i++)
40                {
41if (str[i] == '(' || str[i] == '[' || str[i] == '{')
42                    {
43                        left = i;
44                    }
45if (str[i] == ')' || str[i] == ']' || str[i] == '}')
46                    {
47                        right = i;
48break;
49                    }
50                }
51//展开插⼊
52int times = (int)(str[left - 1] - '0');
53string temp_str(str.begin() + left + 1, str.begin() + right); 54//在右括号后插⼊
55int insert_end = right;
56for (int i = 0; i < times - 1; i++)
57                {
58for (int j = 0; j < temp_str.length(); j++)
59                    {
60                        str.insert(str.begin() + insert_end + 1, temp_str[j]); 61//cout << str << endl;
62                        insert_end ++;
63                    }
64                }
65//删除括号和数字
66                ase(str.begin() + right);
67                ase(str.begin() + left);
68                ase(str.begin() + left - 1 );
69            }
70            reverse(str.begin(), d());
71//倒序输出
72            cout << str <<endl;
73        }
74    }
75
76
77    system("pause");
78return0;
79 }
第三题:时间不够了,没写出来
题⽬描述:
输⼊⼀个N*M矩阵栅格,每个栅格都有⼀个⾼程值代表海拔⾼度,⼩明从出发点到终点有⼏条不同路径?每次只能往更⾼海拔的地⽅去,⾛过的地⽅不能再⾛,只能前后左右⾛。
例:输⼊:
5 4
0 1 0 0
0 2 3 3
0 3 0 0
0 4 5 6
0 7 6 0
0 1 4 1
第⼀⾏代表M*N,⽹格⼤⼩
后⾯是M*N的矩阵
最后⼀⾏前两个数字代表起始坐标,后⾯两个数字代表⽬的坐标(坐标从左上⾓(0,0)开始)。
输出:2
即两条不同路径
解法:
1 #include<iostream>
2 #include<string>
3 #include<vector>
4 #include<stack>
5using namespace std;
6
7
8//建⽴⼀个结构体
9
10struct grid {
11int high = 0;
12//flag为0代表未到达过
13int arived_flag = 0;
14 };
15//深度优先遍历搜索函数
16int DFT_result(vector<vector<grid>> map,int m,int n, int des_zuobiao[2]) {
17int result = 0;
18int M = map.size();
19int N = map[0].size();
20if (m == des_zuobiao[0] && n == des_zuobiao[1])
21    {
22        result++;
23return result;
24    }
25else
26    {
27//当前位置设置为已⾛过
28        map[m][n].arived_flag = 1;
29//判断是否越界,上下左右邻接点
30if (m - 1 >= 0)
31        {
32if (map[m - 1][n].arived_flag != 1 && map[m - 1][n].high > map[m][n].high)
33            {
34                result += DFT_result(map, m - 1, n, des_zuobiao);
35            }
36        }
37if (m + 1 <= M - 1)
38        {
39if (map[m + 1][n].arived_flag != 1 && map[m + 1][n].high > map[m][n].high)
40            {
41                result += DFT_result(map, m + 1, n, des_zuobiao);
42            }
43        }
44if (n - 1 >= 0)
45        {
字符串长度17模式串长度846if (map[m][n - 1].arived_flag != 1 && map[m][n - 1].high > map[m][n].high)
47            {
48                result += DFT_result(map, m, n - 1, des_zuobiao);
49            }
50        }
51if (n + 1 <= N - 1)
52        {
53if (map[m][n + 1].arived_flag != 1 && map[m][n + 1].high > map[m][n].high)
54            {
55                result += DFT_result(map, m, n + 1, des_zuobiao);
56            }
57        }
58
59    }
60
61
62return result;
63 }
64int main(){
65int map_M = 0;
66int map_N = 0;
67    cin >> map_M;
68    cin >> map_N;
69
70    vector<vector<grid>> map;
71for (int i = 0; i < map_M; i++)
72    {
73        vector<grid> row;
74for (int j = 0; j < map_N; j++) {
75int high = 0;
76            cin >> high;
77            grid grid_temp{ high, 0 };
78            row.push_back(grid_temp);
79//cin >> map[map_M][map_N];
80        }
81        map.push_back(row);
82    }
83
84int pre_zuobiao[2];
85int des_zuobiao[2];
86    cin >> pre_zuobiao[0];
87    cin >> pre_zuobiao[1];
88    cin >> des_zuobiao[0];
89    cin >> des_zuobiao[1];
90
91int result = DFT_result(map, pre_zuobiao[0], pre_zuobiao[1], des_zuobiao);
92    cout << result << endl;
93    system("pause");
94 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。