今天写了一个很蹩脚的算法(实现过程有些复杂,也可能有一些bug,需要优化):

输入一个字符集如"a:3,b:5,C:12,d:100@a:1,b:5,C:9",@前属于全字符集,后面是使用字符集,数字部分代表使用数量;字母区分大小写,字符集间用逗号隔开。

要求输出剩余可用字符集如上结果为"a:3,b:0,C:3"

实现代码如下:
#include <iostream>
(720)#include <vector>
using namespace std;

vector<string> cutStr(string str){
    int len = static_cast<int>(str.size());
    vector<string> ch_set(str.size());
    int start=0;
    int n=0;
    for(int i=0;i<len;++i){
        if(str[i]==,){
            ch_set[n] = str.substr(start,i-start);
            start = i+1;
            n++;
        }
        if(i==len-1){
            ch_set[n] = str.substr(start,i-start+1);
        }
    }
    ch_set.resize(n+1);

    return ch_set;
}
2020-07-27
在牛客打卡1天,今天也很努力鸭!
全部评论
接上: string compAndSetValue(string avail_str, string use_str){ // a:5 & a:3 => a:2 int len1 = avail_str.size(); int index1 = avail_str.find(':'); string a_pre_str = avail_str.substr(0,index1); string a_post_str = avail_str.substr(index1+1,len1-1-index1); int a_num; sscanf(a_post_str.c_str(),"%d",&a_num); // convert string to number int len2 = use_str.size(); int index2 = use_str.find(':'); string u_pre_str = use_str.substr(0,index2); string u_post_str = use_str.substr(index2+1,len2-1-index2); int u_num; sscanf(u_post_str.c_str(),"%d",&u_num); // convert string to number if(a_pre_str==u_pre_str){ a_num -= u_num; char ch_num[10]; //const_cast<char*>(a_post_str.c_str()) sprintf(ch_num,"%d",a_num); // convert number to string a_post_str = ch_num; avail_str = a_pre_str + ':' + a_post_str; } return avail_str; } string outputAvailSet(vector<string> avail_set, vector<string> used_set){ int a_len = avail_set.size(); int u_len = used_set.size(); for(int i=0;i<u_len;++i){ for(int j=0;j<a_len;++j){ avail_set[j] = compAndSetValue(avail_set[j],used_set[i]); } } string str; for(int i=0;i<a_len;++i){ if(i<a_len-1){ str += avail_set[i] + ','; }else{ str += avail_set[i]; } } return str; } int main(int argc, char *argv[]) { string str = "a:3,b:5,C:12,d:100@a:1,b:5,C:9"; //input unsigned long long cut_point = str.find('@'); int len = str.size(); string str1 = str.substr(0,cut_point); string str2 = str.substr(cut_point+1,len-1-cut_point); vector<string> avail_set = cutStr(str1); vector<string> used_set = cutStr(str2); string avail_set_str = outputAvailSet(avail_set,used_set); cout<<avail_set_str<<endl; //output return 0; }
点赞 回复 分享
发布于 2020-07-27 18:09

相关推荐

不愿透露姓名的神秘牛友
07-15 17:46
暑期就挂了,秋招还有机会吗
大聪明777:研发提前批,14号刚开的,官网上面的配图上有写。提前批没过的话,秋招还可以投,不过前面的笔试/面试记录会被保留,供秋招参考
26届校招投递进展
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-18 18:30
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务