數(shù)據(jù)結(jié)構(gòu)不難9

2019/3/22更新:第一次更 沒來得及寫解題思路
————————————————————————

時間限制:1000ms
單點時限:1000ms
內(nèi)存限制:256MB

描述

翻轉(zhuǎn)一個鏈表

特殊要求:請使用以下鏈表結(jié)構(gòu)

class Node
{
int value;
Node next;
}

輸入

輸入包含多組數(shù)據(jù)府适。對于每組數(shù)據(jù):

第一行是n载碌,表示鏈表長度勿她;當(dāng)n=-1時善镰,表示輸入結(jié)束墨叛。(1 <= n <= 100)

第二行是n個整數(shù)博其,表示鏈表每一位所存儲的內(nèi)容殃恒。
輸出

針對每組輸入植旧,輸出翻轉(zhuǎn)后的鏈表的內(nèi)容。
樣例輸入

4
1 3 5 7
-1

樣例輸出

7 5 3 1

ac代碼

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

class ListNode
{
public:
    int val;
    ListNode *next;
    ListNode (int val)
    {
        this->val = val;
        this->next = NULL;
    }
};

int main()
{
    int n;
    while (1) {
        cin >> n;
        if (n == -1) break;
        ListNode dummy(0), *cur = &dummy;
        int val; 
        // construct the linked list
        for (int i = 0; i < n&&val!=-1; ++i) { 
            cin >> val;
            cur->next = new ListNode(val);
            cur = cur->next;
        }

        // reverse
        ListNode *head = dummy.next;
        ListNode *prev = NULL;
        while (head) {
            ListNode *next = head->next;
            head->next = prev;
            prev = head;
            head = next;
        }
        head = prev;

        // print
        while (head->next) {
            cout << head->val << " ";
            head = head->next;
        }
        cout << head->val << endl;
    }
}

第二題

時間限制:10000ms

單點時限:1000ms

內(nèi)存限制:256MB

<dl class="des">

描述

編寫一個程序可以完成基本的帶括號的四則運(yùn)算离唐。其中除法(/)是整除病附,并且在負(fù)數(shù)除法時向0取整。(C/C++/Java默認(rèn)的除法就是向0取整亥鬓,python默認(rèn)的是向負(fù)無窮取整完沪。)

例如計算 100 * ( 2 + 12 ) - (20 / 3) * 2, 結(jié)果是1388。

輸入

一個長度不超過100的字符串嵌戈,代表要計算的算式覆积。包含數(shù)字0-9以及+-*/()。

輸入保證計算過程不會超過32位有符號整數(shù)熟呛,并且其中的'-'都是減號沒有負(fù)號宽档。

輸出

計算的結(jié)果。

樣例輸入

100*(2+12)-(20/3)*2

樣例輸出

1388

AC代碼

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
 
int getrink(char opt)
{
    if(opt == '+' || opt == '-') return 10;
    if(opt == '*' || opt == '/') return 20;
    if(opt == '(') return 0;
    else return -1;
}
 
int postfix(string &str_post,string &str_mid)
{
    stack<char> opt;
    while(!opt.empty()) opt.pop();
    bool flag=false;
    for(int i=0; str_mid[i]!='\0'; i++)
    {
        if(str_mid[i]>='0'&&str_mid[i]<='9')
        {
            if(flag)
            {
                str_post+='&';
            }
            else
            {
                flag=true;
            }
            while(str_mid[i]>='0'&&str_mid[i]<='9')
            {
                str_post+=str_mid[i];
                i++;
            }
            i--;
        }
        else if(str_mid[i]=='(')
        {
            opt.push(str_mid[i]);
        }
        else if(str_mid[i]==')')
        {
            if(!opt.empty()&&opt.top()!='(')
            {
                str_post+=opt.top();
                opt.pop();
                flag=false;
            }
            if(opt.top()=='(')
            {
                opt.pop();
            }
        }
        else if(str_mid[i]=='+'||str_mid[i]=='-'||str_mid[i]=='*'||str_mid[i]=='/')
        {
            int a1=getrink(str_mid[i]);
            int a2;
            while(!opt.empty())
            {
                a2=getrink(opt.top());
                if(a1<=a2)
                {
                    str_post+=opt.top();
                    opt.pop();
                    flag=false;
                }
                else
                {
                    break;
                }
            }
            opt.push(str_mid[i]);
        }
    }
    while(!opt.empty())
    {
        str_post+=opt.top();
        opt.pop();
    }
}
 
int getresult(int a,int b,char opp)
{
    if(opp=='+') return a+b;
    if(opp=='-') return a-b;
    if(opp=='*') return a*b;
    if(opp=='/') return a/b;
}
 
int compute(string str)
{
    int op1,op2,temp;
    stack<int> data;
    while(!data.empty()) data.pop();
    for(int i=0;str[i]!='\0';i++)
    {
        if(str[i]=='&') continue;
        else if(str[i]>='0'&&str[i]<='9')
        {
            temp=0;
            while(str[i]>='0'&&str[i]<='9')
            {
                temp=temp*10+str[i]-'0';
                i++;
            }
            i--;
            data.push(temp);
        }
        else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
        {
            op1=data.top();
            data.pop();
            op2=data.top();
            data.pop();
            temp=getresult(op2,op1,str[i]);
            data.push(temp);
        }
    }
    return data.top();
}
 
int main()
{
    string str_mid,str_post;
    while(cin>>str_mid)
    {
        postfix(str_post,str_mid);
        cout<<compute(str_post)<<endl;
        break;
    }
    return 0;
}

第四題

時間限制:5000ms
單點時限:1000ms
內(nèi)存限制:256MB

描述

柱狀圖是由一些寬度相等的長方形下端對齊后橫向排列得到的圖形惰拱。

現(xiàn)在有由n個寬度為1雌贱,高度分別為h1,h2...hn的長方形從左到右依次排列組成的柱狀圖。問里面包含的長方形的最大面積是多少偿短。

如高度 1 2 3 包含的最大長方形面積是4
輸入

數(shù)字n和隨后的n個數(shù)字欣孤,空格隔開
輸出

最大面積
樣例輸入

7 2 1 4 5 1 3 3

樣例輸出

8

AC代碼

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <stack> 
#include <vector> 
#include <cmath> 
using namespace std; 
const int maxn = 100010; 
int n; 
int h[maxn],L[maxn],R[maxn]; 
int st[maxn]; 
void solve() 
{ 
    int t = 0; 
    for(int i=0;i<n;i++) 
    { 
        while(t>0 && h[st[t-1]] >= h[i]) 
            t--; 
        L[i] = t==0?0:(st[t-1]+1);
        st[t++] = i; 
    } 
    t = 0; 
    for(int i=n-1;i>=0;i--) 
    { 
        while(t > 0 && h[st[t-1]] >= h[i]) 
            t--; 
        R[i] = t == 0 ? n : st[t-1]; 
        st[t++] = i; 
    } 
    long long ans = 0; 
    for(int i=0;i<n;i++) 
    { 
        ans = max(ans , (long long)h[i]*(R[i]-L[i])); 
    } 
    printf("%lld\n",ans); 
}
int main() 
{ 
    while(scanf("%d",&n)==1 && n){

        for(int i=0;i<n;i++) 
            scanf("%d",&h[i]); 
        solve(); 
        break;
    }
    return 0; 
}

第五題

時間限制:10000ms
單點時限:1000ms
內(nèi)存限制:256MB

描述

請你實現(xiàn)一個加強(qiáng)版的棧,支持以下操作:

push x: 向棧頂加入一個整數(shù)x

pop: 從棧頂彈出一個整數(shù)昔逗,并且輸出該整數(shù)

inc k x: 將處于棧底的前k個整數(shù)加x降传。
輸入

第一行包含一個整數(shù)N,代表操作的數(shù)量勾怒。

以下N行每行一條操作婆排。

1 ≤ N ≤ 200000, 0 ≤ x ≤ 100000, 1 ≤ k ≤ 當(dāng)前棧的大小
輸出

對于每一個pop操作,輸出彈出的整數(shù)數(shù)值笔链。
樣例輸入

6  
push 1  
inc 1 2  
push 2  
inc 2 2  
pop  
pop

樣例輸出

4  
5

AC代碼

#include <bits/stdc++.h>

using namespace std;

int sk[210000], top, fg[210000];

int main()
{
    int n, a, b;
    cin>>n;
    string op;
    top = -1;
    memset(fg, 0, sizeof(fg));
    while(n--){
        cin>>op;
        if(op=="push"){
            cin>>a;
            sk[++top] = a;
        }else if(op=="inc"){
            cin>>a>>b;
            fg[a-1] += b;
        }else if(op=="pop"){
            cout<<sk[top]+fg[top]<<endl;
            fg[top-1] += fg[top];
            fg[top] = 0;
            top--;
        }
    }

    return 0;
}

第六題

時間限制:5000ms
單點時限:1000ms
內(nèi)存限制:256MB

描述

有一個整型數(shù)組arr和一個大小為w的窗口從數(shù)組的最左邊滑到最右邊段只,窗口每次向右滑動一個位置。

例如鉴扫,數(shù)組為[4,3,5,4,3,3,6,7]赞枕,窗口大小為3時:依次出現(xiàn)的窗口為[4,3,5], [3,5,4], [5,4,3], [4,3,3], [3,3,6], [3,6,7]。

如果數(shù)組長度是n,窗口大小是w炕婶,則一共產(chǎn)生n-w+1個窗口姐赡。
輸入

第一行 n 和 w,空格隔開柠掂,n為數(shù)組長度项滑,w為窗口寬度
第二行為n個整數(shù),作為數(shù)組元素涯贞,空格隔開
輸出

n-w+1個數(shù)枪狂,每個數(shù)是對應(yīng)窗口中的最大值。

例如上面的例子宋渔,應(yīng)該返回[5,5,5,4,6,7]摘完。
樣例輸入

8 3
4 3 5 4 3 3 6 7

樣例輸出

5 5 5 4 6 7

AC代碼

#include <bits/stdc++.h>
#include<vector>
#include <iostream>
using namespace std; 

vector<int> fun(const vector<int> &vec, const int &n, const int &w) 
{ 
    vector<int> res; 
    deque<int> dq; 
    for (int i = 0; i<n; ++i) 
    { 
        if (dq.empty()) dq.push_back(vec[i]);
        //從隊尾插入元素 
        else 
        { 
            while (!dq.empty()) 
            { 
                if (dq.back() >= vec[i]) break; 
                else
                    //如果隊尾元素<下一個元素,則不斷刪除隊尾元素(保證次最大值總是緊鄰隊頭元素) 
                    dq.pop_back(); 
            } 
            dq.push_back(vec[i]);
            //如果隊尾(有時候也是隊頭)元素>=下一個元素加入隊尾 
        } 
        if (dq.size() >= w+1)
            //當(dāng)前隊列元素>=窗口大小傻谁,刪除隊頭元素 
            dq.pop_front(); 
        if (i >= w -1) res.push_back(dq.front());
        //隊頭元素是滑動窗口的最大值 
    }
    return res; 
} 

int main() 
{ 
    int a,b;
    cin>>a>>b;
    int x[a];
    for (int i =0;i<a;i++){
        cin>>x[i];
    }
    vector<int> v1(x,x+a); 
    vector<int> v2 = fun(v1, a, b);
    int y = v2.size(); 
    for (int i = 0;i<y;i++){ 
        cout << v2[i] ;
        if (i!=y-1)
            cout<<" "; 
    } 
    return 0; 
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市列粪,隨后出現(xiàn)的幾起案子审磁,更是在濱河造成了極大的恐慌,老刑警劉巖岂座,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件态蒂,死亡現(xiàn)場離奇詭異,居然都是意外死亡费什,警方通過查閱死者的電腦和手機(jī)钾恢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸳址,“玉大人瘩蚪,你說我怎么就攤上這事「迨颍” “怎么了疹瘦?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巡球。 經(jīng)常有香客問我言沐,道長,這世上最難降的妖魔是什么酣栈? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任险胰,我火速辦了婚禮,結(jié)果婚禮上矿筝,老公的妹妹穿的比我還像新娘起便。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布缨睡。 她就那樣靜靜地躺著鸟悴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奖年。 梳的紋絲不亂的頭發(fā)上细诸,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音陋守,去河邊找鬼震贵。 笑死,一個胖子當(dāng)著我的面吹牛水评,可吹牛的內(nèi)容都是我干的猩系。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼中燥,長吁一口氣:“原來是場噩夢啊……” “哼寇甸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疗涉,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拿霉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咱扣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绽淘,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年闹伪,在試婚紗的時候發(fā)現(xiàn)自己被綠了沪铭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡偏瓤,死狀恐怖杀怠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厅克,我是刑警寧澤驮肉,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站已骇,受9級特大地震影響离钝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褪储,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一卵渴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲤竹,春花似錦浪读、人聲如沸昔榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽互订。三九已至,卻和暖如春痘拆,著一層夾襖步出監(jiān)牢的瞬間仰禽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工纺蛆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留吐葵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓桥氏,卻偏偏與公主長得像温峭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子字支,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350