2015華為實習生 機試題 火星計算器

2021-07-02 02:44:33 字數 2139 閱讀 5917

自定義運算子 @,

#,$,&,並且優先順序@>#>$>&,利用下面的計算法則,計算出乙個給定的字串表示的表示式的值,返回整型結果。

x@y = (x-1)*(

y+1);

x#y = (2*x+5)*(3*y+60)

x$y = (x+1)*(

2*x+3)*(

y-1)*(

2*y-3)

x&y = ((x+y+1)*(

y-9)+(x+7)/(y-8))

輸入:接受多行輸入,每行可能有空格。題目保證不會出現除數為0的情況,且所有運算元都是整數。為了簡單起見,表示式不含有括號。

輸出:對於每一行輸入,輸出乙個運算結果。

輸入樣例:1@2

1#21@1

@11#1#11$1

$11&1&1

1#1@11@1

#11$1&1

1&1$1

1# 1 & 1

12 @ 12

123 @ 123

輸出:0

462

-255881

0186

420315

-17-19

-3608

14315128

分析:

大體來看,程式主要流程為這麼幾步

1. 將得到的字串進行去空格處理。

2. 將第1步得到的字串(此為中綴形式)轉換為逆波蘭式(字尾式)

3. 將第2步得到的逆波蘭式(rpn)進行計算,求出結果並輸出。

核心演算法偽**:

1. 將中綴形式轉化為字尾形式:

從左往右掃瞄inputstring

if 當前掃瞄的是運算元

輸出該運算元

else

//當前掃瞄的是操作符

while 無限迴圈

if 棧為空 或 棧頂元素優先順序小於該操作符

該操作符入棧

break

else

輸出棧頂元素,並pop

//掃瞄inputstring完畢

while 棧內還有元素

輸出棧頂元素,並pop

2.將字尾形式計算為結果

從左往右順序掃瞄inputrpn

if 當前掃瞄的是運算元

該運算元入棧

else

//當前掃瞄到的是操作符

從棧中彈出兩個運算元,參加該操作符的運算

運算結果入棧

注意細節:

1. 在由於要處理76 @ 321這樣的多位運算元,因此在轉換rpn的時候要注意順帶進行atoi的操作。

2. 若直接用cin>>進行初始化輸入的操作,題目中的空格被隔斷成多個字串,比如這種輸入123 @ 123,因此要使用getline來進行初始化操作。

成品**:

使用c++11 mode下的gcc編譯通過。

#include 

#include

#include

#include

using

namespace

std;

class marscalc

private:

map querypriority = map

, , , };

string removespcace(string inputstr)

vector

converttorpn(string inputstr) else else }}

}rpn2.push_back(atoinumber);

while (operatorstack.empty() == false)

return rpn2;

}int calcrpn(vector

inputrpn) else

}return numberstack.top();

}int domarscalc(int num1, int num2, int operate)

}};int main()

return

0;}

華為2023年實習生招聘考試試題

第一題 描述 目描述 編寫乙個函式,將字串中的大寫的字母 a z 挑出來,同時保留原字串中的空格,將挑出的大寫字母和空格按原始位置組成新的字串。例如 1 輸入 australia 輸出 aus 2 輸入 he is a dog 輸出 h i dg 執行時間限制 1 sec 記憶體限制 128 mby...

華為實習生筆試題及解答

3月27日做了華為筆試,3道題2小時。當時沒有拍照,現在憑記憶將題目和 敘述一遍,方便後人。前面將把三道題分別列一下,供後來者自己做。在後面說明一下自己的寫法 下面是各題做法和思路 第一題 題目說的比較複雜,讀懂題意之後大致是,9個字元一組,每組的第乙個字元是標誌位,後面8個字元是位址。如果標誌位是...

筆試面試 2015華為軟體開發實習生

簡單題 10個數字位取3個組成乙個三位數 不能重複 使得這三位數的值最大。方法 這個是送分題,我比較懶,直接用set 來存放,然後輸出後面三個位置的值來搞定 奇偶數排序問題 問題描述 一串無序的數字,先根據所以奇數的逆序排序,再輸出所有偶數的順序排序數值。方法 很簡單,基本兩個排序就可以搞定。最大的...