3月27日做了華為筆試,3道題2小時。當時沒有拍照,現在憑記憶將題目和**敘述一遍,方便後人。前面將把三道題分別列一下,供後來者自己做。在後面說明一下自己的寫法
下面是各題做法和思路:
第一題:題目說的比較複雜,讀懂題意之後大致是,9個字元一組,每組的第乙個字元是標誌位,後面8個字元是位址。如果標誌位是0,位址逆序,標誌位是1位址不變。輸入說明:乙個字串,有多組字元,中間沒有空格。輸出說明:輸出最後的位址,每組位址用空格隔開,最後乙個輸出不需要空格。
解答:第一題很簡單,9個一組得讀取,判斷第乙個是0還是1即可。5分鐘內即可ac。
第二題:簡而言之就是tsp問題。蜂巢在座標(0,0)的位置,有五處花叢,蜜蜂從蜂巢出發,要把五處花叢的花蜜採完再回到蜂巢,最短距離是多少。輸入說明:一行輸入,10個數分別是五處花叢的座標(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5),用空格隔開。輸出說明:輸出最短距離,距離向下取整。
# -*- coding:utf8 -*-
n = int(input())
strs = input()
for i
in range(n):
s = strs[
9*i:
9*i+
9]
# 9個一組得讀取
if s[
0] ==
'0':
s = s[
1:]s = s[::
-1]
# 逆序
else:
s = s[
1:]print(s, end=
' ')
# 空格輸出
解答:一開始就想到了全排列之後貪心演算法取最小,雖然覺得方法太low了,但是讓我一下子寫出蟻群之類的覺得記憶模糊就很糾結。後來發現這道題給了10秒的執行時間,妥妥的決定用全排列了。思路:先用全排列的方式獲取蜜蜂訪問5個花叢的所有可能順序,之後計算每個路徑長度取最小。
解答:當時用的貪心演算法,只通過了70%,後來想到了動態規劃演算法,雖然沒試過但是個人感覺應該可以ac。和leetcode零錢兌換問題差不多的思路。
# -*- coding:utf8 -*-
from math
import sqrt
line = input().strip().split()
n = list(map(int, line))
n = [int(i)
for i
in line]
nums = [[
0,0], [n[
0],n[
1]], [n[
2],n[
3]], [n[
4],n[
5]], [n[
6],n[
7]], [n[
8],n[
9]]]
# 以下為插入的方式獲取全排列的**。沒看過別人的,自己想到的。
# 後來看網上說,遞迴獲取全排列更常見,有興趣的可以自己去搜一下。
order = [[
1]]for i
in range(
2,6):
lens = len(order)
j =
0while j < lens:
for k
in range(i
-1):
tmp = order[j][:]
#order[
-1].insert(k, i)
j +=
1# 接下來是製作距離矩陣
dist = [[
0] *
6for i
in range(
6)]for i
in range(
6):for j
in range(
6):if dist[i][j] ==
0:dist[i][j] = sqrt((nums[i][
0]-nums[j][
0])**
2 + (nums[i][
1]-nums[j][
1])**
2)else:
dist[i][j] = dist[j][i]
# 貪心演算法取最小
minval =
0for path
in order:
sums = dist[
0][path[
0]]for i
in range(
4):sums += dist[path[i]][path[i+
1]]sums += dist[path[
4]][
0]if minval > sums
or minval ==
0:minval = sums
print(int(minval))
# -*- coding:utf8 -*-
# 40 * 50的方格
from random
import randint
# 動態規劃演算法。對於乙個點,四種切法去除被切除的點即可獲得下一次的點集。加上1即可
defdp(points):
if len(points) <=
1:return len(points)
first = points[
0]row = [i
for i
in points
if i[
0] != first[
0]]cntrow = dp(row)
col = [i
for i
in points
if i[
1] != first[
1]]cntcol = dp(col)
left = [i
for i
in points
if i[
2] != first[
2]]cntleft = dp(left)
right = [i
for i
in points
if i[
3] != first[
3]]cntright = dp(right)
return
1 + min(cntrow, cntcol, cntleft, cntright)
# 貪心演算法。假設只能選擇一種方式切,選擇刀數最少的
defgreedyone
(points):
x = [i[
0] for i
in points]
y = [i[
1] for i
in points]
l = [i[
2] for i
in points]
r = [i[
3] for i
in points]
return min(len(set(x)), len(set(y)), len(set(l)), len(set(r)))
n = int(input())
points =
for i
in range(n):
line = input().strip().split()
x = int(line[
0])y = int(line[
1])l = y - x
r = x + y
'''# 此部分為隨機獲取點值,確定自己的動態規劃演算法是否最優
n = 15
for i in range(10):
points =
for j in range(n):
x = randint(0,40)
y = randint(0,50)
l = y - x
r = x + y
res1 = dp(points)
res2 = greedyone(points)
print('dp is %d, greedy is %d'%(res1, res2))
if res1 > res2:
print(points)
'''
3月27日做了華為筆試,3道題2小時。當時沒有拍照,現在憑記憶將題目和**敘述一遍,方便後人。前面將把三道題分別列一下,供後來者自己做。在後面說明一下自己的寫法
2010實習生筆試題
1.已知兩個鍊錶head1和head2各自有序,請把它們合併成乙個有序鍊錶,要求用遞迴方法進行。cpp view plain copy include include using namespace std struct node node make link void display node v...
實習生筆試
這幾天參加過幾場筆試。讓我對筆試有了新的認識。無論是前端,還是後端,最開始的筆試都只是乙個簡單的測試,測試你的邏輯思維能力,演算法能力。單項選擇題基本上是一些計算機的基礎題目,包括網路協議 http tcp ip 記憶體 暫存器。程式的設計。而程式設計題目是一些簡單的演算法題目,不會太難,但是反映的...
2019 網易實習生筆試題目解答
牛牛去犇犇老師家補課,出門的時候面向北方,但是現在他迷路了。雖然他手裡有一張地圖,但是他需要知道自己面向哪個方向,請你幫幫他。輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含乙個正整數,表示轉方向的次數n n 1000 接下來的一行包含乙個長度為n的字串,由l和r組成,l表示向左轉,r表...