華為實習生筆試題及解答

2021-09-17 01:47:44 字數 4227 閱讀 2478

3月27日做了華為筆試,3道題2小時。當時沒有拍照,現在憑記憶將題目和**敘述一遍,方便後人。前面將把三道題分別列一下,供後來者自己做。在後面說明一下自己的寫法

下面是各題做法和思路:

第一題:題目說的比較複雜,讀懂題意之後大致是,9個字元一組,每組的第乙個字元是標誌位,後面8個字元是位址。如果標誌位是0,位址逆序,標誌位是1位址不變。輸入說明:乙個字串,有多組字元,中間沒有空格。輸出說明:輸出最後的位址,每組位址用空格隔開,最後乙個輸出不需要空格。

解答:第一題很簡單,9個一組得讀取,判斷第乙個是0還是1即可。5分鐘內即可ac。

# -*- 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=

' ')

# 空格輸出

第二題:簡而言之就是tsp問題。蜂巢在座標(0,0)的位置,有五處花叢,蜜蜂從蜂巢出發,要把五處花叢的花蜜採完再回到蜂巢,最短距離是多少。輸入說明:一行輸入,10個數分別是五處花叢的座標(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5),用空格隔開。輸出說明:輸出最短距離,距離向下取整。

解答:一開始就想到了全排列之後貪心演算法取最小,雖然覺得方法太low了,但是讓我一下子寫出蟻群之類的覺得記憶模糊就很糾結。後來發現這道題給了10秒的執行時間,妥妥的決定用全排列了。思路:先用全排列的方式獲取蜜蜂訪問5個花叢的所有可能順序,之後計算每個路徑長度取最小。

# -*- 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))

解答:當時用的貪心演算法,只通過了70%,後來想到了動態規劃演算法,雖然沒試過但是個人感覺應該可以ac。和leetcode零錢兌換問題差不多的思路。

# -*- 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表...