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;}
也就是将数组分为两组,使这两组子数组之和的差的绝对值最小。
思路:首先把数组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){ //...}
题意大致如下:牛郎和织女被惩罚洗衣服,要在最快的时间洗完。现有若干颜色和数量的衣服,牛郎和织女可以同时洗,一共有两个搓衣板,两人只能在洗完一种颜色的衣服之后才能洗其他颜色的衣服,并且若其中一人洗完后发现另外一人正在洗该颜色最后一件时,必须先等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;}
- C++组合应用之strtok字符串分割、数组平分算法、动态数组函数传参
- C/C++分割字符串:strtok函数
- C语言分割字符串函数strtok
- C语言分割字符串strtok函数
- 标准C中strtok函数分割字符串
- 标准C中strtok函数分割字符串
- C 语言 分割字符串 strtok函数
- c中字符串分割函数strtok
- c语言字符串分割函数(strtok())
- C语言strtok()函数:字符串分割
- C语言strtok()函数:字符串分割
- C语言strtok()函数:字符串分割
- C语言strtok()函数:字符串分割
- C语言:使用strtok()函数分割字符串
- C/C++如何把一个特定分隔符分割的字符串划分为一个字符串数组,strtok(char *,char*)分割函数
- strtok函数,分割字符串
- strtok 字符串分割函数
- 字符串分割函数 strtok
- CF_5B_CenterAlignment
- [Unity官方文档翻译]Importing Assets 如何向unity导入资源
- BZOJ 1086([SCOI2005]王室联邦-树的划分)
- ios swift 归档解档遇到的坑 3-30
- ubuntu 15.04 通过3306端口远程连接mysql
- C++组合应用之strtok字符串分割、数组平分算法、动态数组函数传参
- android手机安全性测试手段
- PCL系列——从深度图像(RangeImage)中提取NARF关键点
- 【poj 1159】 Palindrome DP(类最长公共子序列)+滚动数组
- virutalbox 无线网卡桥接
- linux爱好者博客
- 关于安卓异步加载Asynctask的学习笔记
- Codeforces--368C--Sereja and Algorithm(规律)
- easyui-datagrid 编辑单元格