华为在线训练(6)

一、编程查找两个字符串的最大公共子串

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
char *commonstring(char *str1,char *str2)
{
	int i,j;
	char *shortstr,*longstr;
	char *substr;
	if(str1==NULL||str2==NULL)//判断str1与str2的有效性
	{
		return NULL;
	}
	if(strlen(str1)<=strlen(str2))//<span style="font-family: Arial, Helvetica, sans-serif;">shortstr和longstr分别指向较短和较长的字符串</span>
	{
		shortstr=str1;
		longstr=str2;
	}
	else
	{
		shortstr=str2;
		longstr=str1;
	}
	if(strstr(longstr,shortstr)!=NULL)//strstr()函数功能用于判断shortstr是否为longstr的子串
	{
		return shortstr;//如果是,返回短字符串
	}
	substr=(char *)malloc(sizeof(char)*(strlen(shortstr)+1));
	for(i=strlen(shortstr)-1;i>0;i--)
	{
		for(j=0;j<=strlen(shortstr)-i;j++)
		{
			memcpy(substr,&shortstr[j],i);//将字符串的一部分复制到substr
			substr[i]='\0';               //其长度逐渐减小
			if(strstr(longstr,substr)!=NULL)//如果在longstr中能找到substr,则返回substr
				return substr;
		}
	}
	return NULL;
}

int main()
{
    char *str1=(char *)malloc(256);
    char *str2=(char *)malloc(256);
	char *common=NULL;
	while(cin>>str1>>str2)
	{
		common=commonstring(str1,str2);
		if(common!=NULL)
		{
			cout<<common<<endl;
		}
		else
			cout<<"字符为空"<<endl;
	}
	return 0;
 }
二、查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
      都按先录入排列在前的规则处理。
   例示:
   jack      70
   peter     96
   Tom       70
   smith     67
   从高到低  成绩    flag=0        
   peter     96    
   jack      70    
   Tom       70    
   smith     67    
   从低到高          flag=1
   smith     67  
   Tom       70    
   jack      70    
   peter     96  
说明:
1、sort与stable_sort的区别。
使用stable_sort可以保证相等元素的原本相对次序在排序后保持不变,而sort不能保证
2、自定义比较函数
在没有指明排序的规则是,系统默认a<b返回为真,即默认从小到大排序。在自定义比较函数
bool comp(const int &a,const int &b)//注意:这里传递的是引用
{
    return a>b;
}
会进行从大到小排序。

#include<stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
bool Compare_up(const pair<string, int>& a, const pair<string, int>& b) //少了const 会报错
{
    return a.second > b.second;
}
bool Compare_down(const pair<string, int>& a, const pair<string, int>& b) 
{
    return a.second < b.second;
}
int main()
{
    int num, compare_mode, score,i;
    string name;
	while(cin>>num>>compare_mode)
	{
		vector< pair<string,int> >str_int; //vc6.0中>>之间要有空格
		for(i=0;i<num;i++)
		{
			cin>>name>>score;
			str_int.push_back(make_pair(name,score));
		}
		if(compare_mode==0)
			stable_sort(str_int.begin(),str_int.end(),Compare_up); 
		else
			stable_sort(str_int.begin(),str_int.end(),Compare_down); 
		/*vector< pair<string,int> >::iterator vi;
		for(vi=str_int.begin();vi!=str_int.end();vi++)
			cout<<(*vi).first<<" "<<(*vi).second<<endl;*/
		for(i=0;i<num;i++)
			cout<<str_int[i].first<<" "<<str_int[i].second<<endl;

	}
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值