【華為機試線上訓練】Day 7
題目描述
請實現如下介面
/* 功能:四則運算
* 輸入:strExpression:字串格式的算術表示式,如: "3+2*{1+2*[-4/(8-6)+7]}"
* 返回:算術表示式的計算結果
*/
public static int calculate(String strExpression)
{
/* 請實現*/
return 0;
}
約束:
-
pucExpression字串中的有效字元包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。
-
pucExpression算術表示式的有效性由呼叫者保證;
輸入描述:
輸入一個算術表示式
輸出描述:
得到計算結果
//先中綴轉字尾再計算字尾表示式的值,需要注意的是對於‘-’為一元運算子的處理和數字//的位數做一個記錄。當看到python只有一行程式碼時,吐了一口老血。。。
#include<iostream>
#include<string>
#include<vector>
#include<stack>
using namespace std;
int main() {
string s;
while (cin >> s) {
stack<char> opera;
vector<int> numcnt;//用來儲存每個數字的位數,以保證計算字尾表示式時的正確性
string s1;//字尾表示式
//中綴表示式轉字尾表示式
for (int i = 0;i<s.size();i++) {
if (s[i] >= '0'&&s[i] <= '9') {
int tmp = 0;
while (s[i] >= '0'&&s[i] <= '9') {
tmp++;
s1 += s[i];
i++;
}
i--;
numcnt.push_back(tmp);
}
else if (s[i] == '-' || s[i] == '+') {
if (s[i] == '-' && (s[i - 1] == '(' || s[i - 1] == '[' || s[i - 1] == '{'))
s1 += '0';
while (!opera.empty()&&(opera.top() == '*' || opera.top() == '/' || opera.top() == '+' || opera.top() == '-')) {
s1 += opera.top();
opera.pop();
}
opera.push(s[i]);
}
else if (s[i] == '*' || s[i] == '/') {
while (!opera.empty()&&(opera.top() == '*' || opera.top() == '/')) {
s1 += opera.top();
opera.pop();
}
opera.push(s[i]);
}
else if (s[i] == '(' || s[i] == '[' || s[i] == '{')
opera.push(s[i]);
else if (s[i] == ')') {
while (opera.top() != '(') {
s1 += opera.top();
opera.pop();
}
opera.pop();
}
else if (s[i] == ']') {
while (opera.top() != '[') {
s1 += opera.top();
opera.pop();
}
opera.pop();
}
else if (s[i] == '}') {
while (opera.top() != '{') {
s1 += opera.top();
opera.pop();
}
opera.pop();
}
else
cout << "Invalid input!" << endl;
}
while (!opera.empty()) {
s1 += opera.top();
opera.pop();
}
//計算字尾表示式的值
stack<int> nums;
int ind = 0;
for (int i = 0;i<s1.size();i++) {
if (s1[i] >= '0'&&s1[i] <= '9') {
int total = 0;
while (numcnt[ind]--)
total = 10 * total + (s1[i++] - '0');
i--;
nums.push(total);
ind++;
}
else {
int tmp1 = nums.top();
nums.pop();
int tmp2 = nums.top();
nums.pop();
if (s1[i] == '+')
nums.push(tmp2 + tmp1);
else if (s1[i] == '-')
nums.push(tmp2 - tmp1);
else if (s1[i] == '*')
nums.push(tmp2*tmp1);
else
nums.push(tmp2 / tmp1);
}
}
cout << nums.top() << endl;
}
}
參考:https://blog.csdn.net/shizheng163/article/details/50988023
題目描述
Levenshtein 距離,又稱編輯距離,指的是兩個字串之間,由一個轉換成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。編輯距離的演算法是首先由俄國科學家Levenshtein提出的,故又叫Levenshtein Distance。
Ex:
字串A:abcdefg
字串B: abcdef
通過增加或是刪掉字元”g”的方式達到目的。這兩種方案都需要一次操作。把這個操作所需要的次數定義為兩個字串的距離。
要求:
給定任意兩個字串,寫出一個演算法計算它們的編輯距離。
請實現如下介面
/* 功能:計算兩個字串的距離
* 輸入: 字串A和字串B
* 輸出:無
* 返回:如果成功計算出字串的距離,否則返回-1
*/
public static int calStringDistance (String charA, String charB)
{
return 0;
}
輸入描述:
輸入兩個字串
輸出描述:
得到計算結果
//典型的動態規劃優化編輯器問題
//參考部落格 http://blog.csdn.net/shizheng163/article/details/50988023
#include<iostream>
#include <string>
#include <vector>
using namespace std;
int calStringDistance(string a,string b){
int n = (int)a.size(),m = (int)b.size();
vector<vector<int>>dp(n+1,vector<int>(m+1,0));
dp[0][0] = 0;//dp[x][y]代表將a字串前x個字元修改成b字串前y個字元
for (int i=1; i<=m; ++i) dp[0][i] = i;
for (int i=1; i<=n; ++i) dp[i][0] = i;
for (int i=1; i<=n; ++i) {
for (int j=1; j<=m; ++j) {
int one = dp[i-1][j] +1,two = dp[i][j-1]+1,three = dp[i-1][j-1];
if(a[i-1]!=b[j-1]) three+=1;
dp[i][j] = min(min(one,two),three);
}
}
return dp[n][m];
}
int main(){
string a,b;
while(cin>>a>>b)
cout<<calStringDistance(a, b)<<endl;
return 0;
}
題目描述
題目描述
把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。
輸入
每個用例包含二個整數M和N。0<=m<=10,1<=n<=10。
樣例輸入
7 3
樣例輸出
8
/**
* 計算放蘋果方法數目
* 輸入值非法時返回-1
* 1 <= m,n <= 10
* @param m 蘋果數目
* @param n 盤子數目數
* @return 放置方法總數
*
*/
public static int count(int m, int n)
輸入描述:
輸入兩個int整數
輸出描述:
輸出結果,int型
#include<iostream>
#include<cstdlib>
using namespace std;
int count1(int m,int n)
{
if(m==0 || n==1)
{
return 1;
}
if(m<n)
{
return count1(m,m);
}
else
{
return (count1(m,n-1)+count1(m-n,n));
}
}
int main()
{
int m;
int n;
while(cin>>m>>n)
{
cout<<count1(m,n)<<endl;
}
return 0;
}
/* 解題分析:
設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論,
當n>m:必定有n-m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m)
當n<=m:不同的放法可以分成兩類:
1、有至少一個盤子空著,即相當於f(m,n) = f(m,n-1);
2、所有盤子都有蘋果,相當於可以從每個盤子中拿掉一個蘋果,不影響不同放法的數目,即f(m,n) = f(m-n,n).
而總的放蘋果的放法數目等於兩者的和,即 f(m,n) =f(m,n-1)+f(m-n,n)
遞迴出口條件說明:
當n=1時,所有蘋果都必須放在一個盤子裡,所以返回1;
當沒有蘋果可放時,定義為1种放法;
遞迴的兩條路,第一條n會逐漸減少,終會到達出口n==1;
第二條m會逐漸減少,因為n>m時,我們會return f(m,m) 所以終會到達出口m==0.
*/
相關文章
- 【華為機試線上訓練】Day 10
- 【華為機試線上訓練】Day 11
- 【華為機試線上訓練】Day 6
- 【華為機試線上訓練】Day 8
- 【華為機試線上訓練】Day 9
- 【華為機試線上訓練】Day1
- 【華為機試線上訓練】Day2
- 【華為機試線上訓練】Day3
- 【華為機試線上訓練】Day4
- 華為部分線上測試題
- ECS 7天實踐訓練營-day1
- 演算法訓練day2演算法
- 7/14 訓練筆記筆記
- 雲端開爐,線上訓練,Bert-vits2-v2.2雲端線上訓練和推理實踐(基於GoogleColab)Go
- 華為機試 (11/8)
- 華為鯤鵬HCIA考試-練習05
- Day7 特訓營小結
- 華為freebuds耳機藍芽搜尋不到怎麼辦 華為freelace連線不上藍芽
- k線訓練營排名
- 史丹佛DAWNBench:華為雲ModelArts深度學習訓練全球最快深度學習
- 20240927 隨機訓練隨機
- 機率期望訓練
- CSAO×虎符安全訓練營 強強聯合,重磅上線
- 華為鯤鵬 DAY 4
- 華為nova7有耳機孔嗎?華為nova7系列有單獨耳機孔嗎
- 手把手教你基於華為雲,實現MindSpore模型訓練模型
- Day7 備戰CCF-CSP練習
- 牛客網--華為機試題
- 華為機試-取近似值
- 華為雲在香港為大模型訓練推理提供即開即用澎湃算力大模型
- 【題解】Solution Set - NOIP2024集訓Day7 李超線段樹
- 教育培訓機構試水線上教育平臺搭建的可行性
- 華為昇騰訓練營筆記-Ascend C運算元開發筆記
- 小雞老師華為版終於上線華為應用市場
- ECS7天實踐進階訓練營Day2:基於阿里雲ECS部署MediaWiki阿里
- 線上教育培訓機構如何推廣自己
- 華為機試題刷題總結
- 華為諾亞頻域LLM「帝江」:僅需1/50訓練成本,7B模型媲美LLaMA,推理加速5倍模型