一些常见的算法题目

2019-07-10  本文已影响0人  漫游之光

合法的出栈序列

已知1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,返回等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?

bool check(stack<int> &s){
    stack<int> s1;
    int n = s.size();
    for(int i=1;i<=n;i++){
        s1.push(i);
        while (s1.size() > 0 && s1.top() == s.top()){
            s1.pop();
            s.pop();
        }
    }
    if(s.size() == 0){
        return true;
    }
    return false;
}

大数的加法和乘法

这个感觉还是挺常见,说是算法,其实就是模拟手工运算加法乘法,其实并不难。但后来看到别人写的程序,才发现自己写的程序太复杂了,并且思维不是很清晰,所以,参照大佬的算法,又重写写了一下。
大数加法的代码如下。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <regex>
using namespace std;

int main(int argc, char const *argv[])
{
    string s1,s2;
    while(cin>>s1>>s2){
        regex number("[0-9]*");
        if(!regex_match(s1,number) || !regex_match(s2,number)){
            cout<<"error"<<endl;
            continue;
        }
        reverse(s1.begin(),s1.end());
        reverse(s2.begin(),s2.end());
        if(s1.size() > s2.size()){
            for(int i=0;i<s1.size() - s2.size();i++){
                s2.push_back('0');
            }
        }else if(s1.size() < s2.size()){
            for(int i=0;i<s2.size() - s1.size();i++){
                s1.push_back('0');
            }
        }
        vector<int> v( s1.size() + 1,0);
        for(int i=0;i<s1.size();i++){
            v[i] += s1[i] -  '0' + s2[i] - '0'; 
        }
        for(int i=0;i<v.size() - 1;i++){
            if(v[i] >= 10){
                v[i+1] += v[i] /10;
                v[i] %= 10;
            }
        }
        string res;
        int i;
        for(i=v.size()-1;i>0 && v[i] == 0;i--)
            ;
        for(;i>=0;i--){
            res += (char)(v[i] + '0');
        }
        cout<<res<<endl;
    }
    return 0;
}

大数乘法的代码如下。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

int main(int argc, char const *argv[])
{
    string s1,s2;
    while(cin>>s1>>s2){
        reverse(s1.begin(),s1.end());
        reverse(s2.begin(),s2.end());
        vector<int> v(s1.size() + s2.size(),0);
        for(int i=0;i<s1.size();i++){
            for(int j=0;j<s2.size();j++){
                v[i+j] += (s1[i] - '0') * ( s2[j] - '0' );
            }
        }
        for(int i=0;i<v.size() - 1;i++){
            if(v[i] >= 10){
                v[i+1] += v[i] /10;
                v[i] %= 10;
            }
        }
        string res;
        int i;
        for(i=v.size()-1;i>0 && v[i] == 0;i--)
            ;
        for(;i>=0;i--){
            res += (char)(v[i] + '0');
        }
        cout<<res<<endl;
    }
    return 0;
}

这些代码都是在牛客网上做题的代码,所以代码中有一些和题目相关的内容。

上一篇下一篇

猜你喜欢

热点阅读