内存空间 题解

· · 题解

题意

给出 n 条定义变量语句,问这些变量所占的空间。

题解

首先,因为输入可能含空格,所以我们要使用 getline 输入,不能用 cin!!!(我就被坑了)

其次,因为 intlong longstring 的首字母不同,所以我们可以根据首字母判断变量的类型。

知道了变量类型,我们就可以判断他是否为数组了,因为题目规定定义数组一定会在变量类型后面加上一对中括号,所以我们只需要判断变量类型后面有没有中括号就行了。

因为字符串只要统计长度就行了,所以就不讲了。至于变量和数组,也还是比较好处理的。

如果是变量的话,只要统计逗号的数量,计算时把数量加一再乘以所占内存就行了就行了。

如果是数组的话的话,就需要算出每个数组的元素个数,这件事其实也比较简单,可以把数字串提取出来,再用一个函数来把这个字符串转为整型变量,再乘上一个所占的内存就可以了。

AC Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
int nc(string s){//string转int
    int po=0;
    for(int i = 0;i<s.size();i++){
        po=po*10+(s[i]-'0');
    }
    return po;
}
signed main(){
    int n,cnt=0;//定义cnt来统计内存
    string s;
    cin >> n;
    n++;
    for(int i = 1;i<=n;i++){
        getline(cin,s);//可能含空格,使用getline
        if(s[0]=='i'){//计算int
              int c=0;//c表示这一个数组所占的内存
            int f=s.find('[');//判断数组
            if(f==-1){
                for(int i = 0;i<s.size();i++){
                    if(s[i]==',')c+=4;//统计逗号数量
                }
                cnt+=c+4;//加上内存大小
            }
            else{
                int r=0,l=s.find('[',r+1),p;//寻找第一个
                r=s.find(']',l+1);
                while(l!=-1){
                    string s2=s.substr(l+1,r-l-1);//提取子串
                    p=nc(s2);//转int
                    cnt+=p*4;//计算内存大小
                      l=s.find('[',r+1);
                      r=s.find(']',l+1);
                    //寻找下一个
                }
            }
        }
        else if(s[0]=='l'){//判断long long
            int f=s.find('[');
            if(f==-1){//判断数组
                int c=0;//c表示这一个数组所占的内存
                for(int i = 0;i<s.size();i++){
                    if(s[i]==',')c+=8;//统计逗号数量
                }
                cnt+=c+8;//加上内存大小
            }
            else{
                int r=0,l=s.find('[',r+1),p;//寻找第一个
                r=s.find(']',l+1);
                while(l!=-1){
                    string s2=s.substr(l+1,r-l-1);//提取子串
                    p=nc(s2);//转int
                    cnt+=p*8;//计算内存大小
                      l=s.find('[',r+1);
                      r=s.find(']',l+1);
                    //寻找下一个
                }
            }
        }
        else{//判断string
            int r=0,l=s.find('"',r+1),p;
            r=s.find('"',l+1);
            while(l!=-1){
                string s2=s.substr(l+1,r-l-1);//提取子串
                cnt+=s2.size();//加上子串长度
                  l=s.find('"',r+1);
                  r=s.find('"',l+1);
                //寻找下一个
            }
        }
    }
    if(cnt>=1073741824){
        cout << cnt/(1073741824) << "GB";
        cnt%=(1073741824);
    }
    if(cnt>=1024*1024){
        cout << cnt/(1024*1024) << "MB";
        cnt%=(1024*1024);
    }
    if(cnt>=1024){
        cout << cnt/1024 << "KB";
        cnt%=1024;
    }
    if(cnt>0)cout << cnt << "B";
    //输出答案
    return 0;
}

最后,祝大家AC愉快!