華為招聘機試整理5:簡單四則運算,華為四則運算
華為招聘機試整理5:簡單四則運算
題目:簡單四則運算
問題描述: 輸入一個只包含個位元字的簡單四則運算運算式字串,計算該運算式的值
註:
1、運算式只含 +, -, 乘, / 四則運算子,不含括弧
2、運算式數值只包含個位整數(0-9),且不會出現0作為除數的情況
3、要考慮加減乘除按通常四則運算規定的計算優先順序
4、除法用整數除法,即僅保留除法運算結果的整數部分。比如8/3=2。輸入運算式保證無0作為除數情況發生
5、輸入字串一定是符合題意合法的運算式,其中只包括數字字元和四則運算子字元,除此之外不含其它任何字元,不會出現計算溢出情況
要求實現函數:
int calculate(int len,char expStr)
【輸入】 int len: 字串長度;
char expStr: 運算式字串;
【輸出】 無
【返回】 計算結果
樣本
1) 輸入:char expStr = “1+45-8/3”
函數返回:19
2) 輸入:char expStr = “8/33”
函數返回:6
題目分析:
①這道題輸入字串中有可能有五種字元,數字、+、-、*、/。
②這道題還需要注意的是我們要按照運演算法則來進行計算,所以我們要選擇用棧來解決這道題
演算法思路:
①用字串數組當做符號+-/的棧;用int數組作為數位棧
②入棧過程:
數字棧:檢測如果為數字,我們直接-‘0’放入number中;
符號棧:
1)+ - :因為它們運算優先順序比較低,所以我們需要入棧出棧
檢測為+-時候,我們直接放入sign中
2)* / :因為運算優先順序別比較高,所以哦我們可以直接運算
這裡需要注意索引,這個時候數字索引應該-1,但是字串的索引應該加1,之後還需要+1(因為已經運算完了)
/需要多注意一個地方,就是分母不能為0,為0時候,直接返回-1;
③出棧過程
1)首先第一步我們需要把兩個棧的索引都減去1
2)之後用符號索引進行for迴圈,如果檢測為加號,因為我們需要把數字都放入數位前一個索引裡面,數字索引需要減去1先,之後再運算
3)最後出棧結束返回number[0]就可以了
=====================================================================
參考代碼:
//簡單四則運算.cpp//2014.7.10 hepanhui#include <iostream>#include <string>#include <ctype.h>const int maxn = 1000;using namespace std;int calculate(int len, char *expStr){ //非法輸入 if(expStr == NULL) return -1; //定義一個char數組當做符號棧,int數組當做數字棧 char sign[maxn]; int sign_index = 0; int number[maxn]; int number_index = 0; for(int i = 0; i < len; i++) { //堆棧過程 if(isdigit(expStr[i])) { number[number_index ++] = expStr[i] - '0'; continue; } if(expStr[i] == '+' || expStr[i] == '-') { sign[sign_index ++] = expStr[i]; continue; } if(expStr[i] == '*') { number[number_index - 1] *= expStr[i+1] - '0'; i++; continue; } if(expStr[i] == '/') { if(expStr[i+1] != '0') { number[number_index - 1] /= expStr[i+1] - '0'; i++; continue; } else return -1; } } //出棧過程 number_index--; sign_index--; for(int i = sign_index;i >= 0; i--) { if(sign[i] == '+') { number_index --; number[number_index] += number[number_index + 1]; continue; } if(sign[i] == '-') { number_index --; number[number_index] -= number[number_index + 1]; continue; } } return number[0];}int main(){ int len; cin >> len; char str[maxn]; cin >> str; cout << calculate(len,str) << endl; return 0;}
調試過程中易犯錯誤的地方:
①當子函數返回為int型時候,我們非法輸入的時候一樣不能寫return 0 最好寫return -1
②出棧的時候要特別注意先將索引直接-1;
④運算過程中也需要注意,我們也要先把數字索引減去1,為了最終返回number[0]儲存最終結果。
昨天華為校園招聘機試,懂的人都知道做對兩道已經很不容易了,昨天問工作人員他們也說做對兩道非常優秀
不要著急,因為人多嘛,總得給人家時間對吧,華為面試還是很公平公正的,找關係走後門的基本沒有,既然你初試成績不錯那應該會有複試機會的,不過也有可能別人工作失誤遺漏之類的,所以你過兩天可以想辦法找學校就業指導中心要HR的連絡方式,相信會有效果的,我也想進華為
華為2013校園招聘,機試完了,什時面試,是不是被刷了
建議去對應大街網啊,應屆生網看看。他們有詳細的進程的。
另外,你也可以直接去新浪微博去@對應的招聘人員,裡面有華為的每個地區的招聘微博的。
祝你好運。