【華為機試線上訓練】Day 7

HelloZEX發表於2018-08-06

題目描述

請實現如下介面

    /* 功能:四則運算

     * 輸入:strExpression:字串格式的算術表示式,如: "3+2*{1+2*[-4/(8-6)+7]}"

         * 返回:算術表示式的計算結果

     */

    public static int calculate(String strExpression)

    {

        /* 請實現*/

        return 0;

    } 

約束:

  1. pucExpression字串中的有效字元包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。

  2. 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.
*/


 

相關文章