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

一、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 4
yellow red blue
2 yellow
3 red
4 red
6 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;
}




你可能感兴趣的:(C++,字符串分割,校招笔试题,数组平分,动态数组传参)