C++组合应用之strtok字符串分割、数组平分算法、动态数组函数传参

来源:互联网 发布:c语言 字符串统计函数 编辑:程序博客网 时间:2024/06/12 20:59

一、strtok字符串分割:

原型:char *strtok(char *str, const char *delim);

功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

说明分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针

返回值从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。如果查找不到delim中的字符时,返回当前strtok的字符串的指针。所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

使用(c++

#include<iostream>#include<cstring>using namespace std;int main(){    char sentence[]="This is a sentence with 7 tokens";    cout << "The string to be tokenized is:\n" << sentence << "\n\nThe tokens are:\n\n";    char *tokenPtr=strtok(sentence,"");    while(tokenPtr!=NULL) {        cout<<tokenPtr<<'\n';        tokenPtr=strtok(NULL,"");    }    //cout << "After strtok,sentence=" << tokenPtr<<endl;    return 0;}
函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个 ',' 之前的字符串,也就是上面的程序第一次输出abc。第二次调用该函数strtok(NULL,","),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。
二、数组平分算法

也就是将数组分为两组,使这两组子数组之和的差的绝对值最小。

思路首先把数组a的所有元素求和sum, 然后取和的一半设为x,然后遍历数组a的所有子集并且分别求出所有子集的元素之和sum(i);比较abs(x-sum(i)),取小。

实现(c++)

//数组平分算法int getMinTime(const vector<int>& arr){    int n = arr.size();    int sum = 0;    for(int i=0;i<n;i++){        sum += arr[i];    }    int minTime = sum,tmp = 0;    for(int i=0;i<n;i++){        tmp = 0;        for(int j=i;j<n;j++){           tmp += arr[j];           //cout<<sum/2<<tmp<<" "<<minTime;           if((tmp>(sum/2))&&(tmp<minTime)){            minTime = tmp;           }        }    }    return minTime;}

三、vector动态数组函数传参

例子:如果定义了vector<int> arr,在函数调用时比如这样是不行的:

int func(int *arr){    //...}
正确的做法

int func(const vector<int>& arr){    //...}
对于字符串数组亦如此:

void func(const vector<string>& str){    //...}


下面附上2016年宜信校招的一个编程笔试题

题意大致如下:牛郎和织女被惩罚洗衣服,要在最快的时间洗完。现有若干颜色和数量的衣服,牛郎和织女可以同时洗,一共有两个搓衣板,两人只能在洗完一种颜色的衣服之后才能洗其他颜色的衣服,并且若其中一人洗完后发现另外一人正在洗该颜色最后一件时,必须先等ta洗完才能一起洗其他颜色衣服。

input:

输入包含若干测试用例,第一行是m,n两个正整数(m<10,n<100)分别代表颜色和衣服数量。第二行包含m和颜色字符串,字符串之间空格分开,接下来是n行字符串,每行字符串分别描述洗涤时间和颜色,洗涤时间不超过1000,同样洗涤时间和颜色用空格分开。

output:

总最小洗涤时间


输入示例

3 4yellow red blue2 yellow3 red4 red6 blue

输出

12

我的解答(c++)

#include <iostream>#include <string.h>#include <vector>using namespace std;//匹配字符串数组对应下标int getIndex(const vector<string>& str,int n,string s){    int index = 0;    for(int i=0;i<n;i++){        if(str[i]!=s){            index++;        }else{            return index;        }    }}//数组平分算法int getMinTime(const vector<int>& arr){    int n = arr.size();    int sum = 0;    for(int i=0;i<n;i++){        sum += arr[i];    }    int minTime = sum,tmp = 0;    for(int i=0;i<n;i++){        tmp = 0;        for(int j=i;j<n;j++){           tmp += arr[j];           //cout<<sum/2<<tmp<<" "<<minTime;           if((tmp>(sum/2))&&(tmp<minTime)){            minTime = tmp;           }        }    }    return minTime;}int main(){    int m,n;    while(cin>>m>>n){        vector <string> color(m);//存储颜色字符串数组        for(int i=0;i<m;i++){            cin>>color[i];        }        vector <vector<int> > time(m,vector<int>(0));//存储对应时间数组        int t;        string c;                //将对应颜色分类存储进time二维数组        for(int i=0;i<n;i++){            cin>>t>>c;            int index = getIndex(color,n,c);            time[index].push_back(t);        }                int tmp = 0;        for(int i=0;i<m;i++){            tmp += getMinTime(time[i]);//调用数组平分算法并求和        }        cout<<tmp<<endl;    }        return 0;}




1 0
原创粉丝点击