以技术为主
编程语言与算法设计
为STL中的std::string添加trim函数的实现
十一 14th
代码如下:
//自定义trim函数
string trim(string& str)
{
string::size_type pos = str.find_last_not_of(‘ ‘);
if(pos != string::npos)
{
str.erase(pos + 1);
pos = str.find_first_not_of(‘ ‘);
if(pos != string::npos) str.erase(0, pos);
}
else str.erase(str.begin(), str.end());
return str;
std::string的split函数的自定义实现
十一 14th
std::string中未定义split函数,网上找到一种方法实现,分享之
//自定义实现split函数
void split(std::string& s, std::string& delim,std::vector< std::string >* ret)
{
size_t last = 0;
size_t index=s.find_first_of(delim,last);
while (index!=std::string::npos)
{
string tt = s.substr(last,index-last);
tt.
ret->push_back();
last=index+1;
index=s.find_first_of(delim,last);
}
if (index-last>0)
{
ret->push_back(s.substr(last,index-last));
}
}
最大子段和、最大子矩阵和、最大m子段和问题总结
十 30th
1,最大子段和问题
代码:
int MaxSum(int n,int *a) { int sum = 0; int b = 0,i; for(i=0;i<n;i++) { if(b>0) b+=a[i]; else b = a[i]; if(b>sum)sum = b; } return sum; }
2,最大子矩阵和问题
代码:
int MaxSum2(int m,int n,int** a) { int sum = 0,i,j,k; int b[105]; for(i=0;i<m;i++) { for(k=0;k<n;k++) { b[k] = 0; } for(j=i;j<m;j++) { for(k=0;k<n;k++) { b[k]+=a[j][k]; } int mx = MaxSum(n,b); if(sum<mx)sum=mx; } } return sum; }
3,最大m子段和问题
double b[50005]; double c[50005]; int MaxSum3(int m,int n,int* a) { int i,j,k,mx,sum; b[0] = 0; c[0] = 0; for(i=1;i<=m;i++) { b[i] = b[i-1] + arr[i]; c[i-1] = b[i]; mx = b[i]; for(j=i+1;j<=i+n-m;j++) { b[j] = b[j-1]>c[j-1]?b[j-1]+arr[j]:c[j-1]+arr[j]; c[j-1] = mx; if(mx<b[j]) { mx = b[j]; } } c[i+n-m] = mx; } sum = b[m]; for(k=m+1;k<=n;k++) { if(sum<b[k])sum=b[k]; } return sum; }
高矮排序问题,很经典【转载】学习下
十 30th
作者:baihacker
来源:http://hi.baidu.com/feixue http://hi.csdn.net/baihacker
问题描述:
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
这个笔试题,很YD,因为把某个递推关系隐藏得很深.
问题分析:
我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.
用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.
比如000000111111就对应着
第一排:0 1 2 3 4 5
第二排:6 7 8 9 10 11
010101010101就对应着 更多 >
近期评论