华为OJ 在字符串中找出连续最长的数字串
来源:互联网 发布:日本动画公司排行知乎 编辑:程序博客网 时间:2024/05/24 00:35
第一种算法 O(n*n),时间超时了。不过答案是对的。
第二种算法 O(nlogn),时间OK,AC通过了。
#include <stdlib.h>#include <string.h>#include <iostream>//#include "oj.h"using namespace std;/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回函数原型: unsigned int Continumax(char** pOutputstr, char* intputstr)输入参数: char* intputstr 输入字符串输出参数: char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串 pOutputstr 指向的内存应该在函数内用malloc函数申请,由调用处负责释放返回值: 连续最长的数字串的长度 */unsigned int Continumax(char** pOutputstr, char* intputstr){int len=strlen(intputstr);int begin,end; //数字串的位置标记 int sub_len=0; //记录连续数字串长度 int sub_len_max=0;for(int i=0;i<len;i++){int j=i;if(intputstr[i]<'0' || intputstr[i]>'9') //若第一个字符非数字,则直接检测下一个字符 continue; while(intputstr[j]>='0' && intputstr[j]<='9'){sub_len++;j++; }if(sub_len>=sub_len_max) //不断更新最大长度,以及位置 {begin=i;end=j;sub_len_max=sub_len;}sub_len=0; }//cout<<"position: "<<begin<<" "<<end<<endl;char *ptr=(char *)malloc(sub_len_max+1); *pOutputstr=ptr; int k;int m=0;for(k=begin;k<=end-1;k++){*((*pOutputstr)+m)=*(intputstr+k);m++;}*((*pOutputstr)+m)=0; //终止符 return sub_len_max;}int main(){char* intputstr = "12345abcd23456awe" ;char *pOutputstr = NULL; unsigned int nLength = Continumax(&pOutputstr, intputstr);cout<<nLength<<endl;if(pOutputstr==NULL) cout<<"pout is null"<<endl; else cout<<"not null"<<endl; cout<<"pOutputstr="<<pOutputstr<<endl;free(pOutputstr);}
第二种方法:
#include <stdlib.h>#include <string.h>#include <iostream>//#include "oj.h"using namespace std;/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回函数原型: unsigned int Continumax(char** pOutputstr, char* intputstr)输入参数: char* intputstr 输入字符串输出参数: char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串 pOutputstr 指向的内存应该在函数内用malloc函数申请,由调用处负责释放返回值: 连续最长的数字串的长度 */unsigned int find_cross_mid(char *intputstr,int sub_begin,int mid,int sub_end,int *begin,int *end){int left_max=0;int right_max=0;int max=0;int i=mid,j=mid+1;if( (intputstr[i]<'0' || intputstr[i]>'9')&&(intputstr[j]<'0' || intputstr[j]>'9') ){ return 0;} while(intputstr[i]>='0' && intputstr[i]<='9'){left_max++;i--;}while(intputstr[j]>='0' && intputstr[j]<='9'){right_max++;j++;}max=left_max+right_max; *begin=i+1; *end=j-1; return max;}int find_digit_subarray(char *intputstr,int sub_begin,int sub_end,int *begin,int *end){int maxLength=0;int tempLength=0; if(sub_begin>sub_end) return 0;else if(sub_begin==sub_end){if(intputstr[sub_begin]>='0' && intputstr[sub_begin]<='9') return 1;else return 0; }else{int mid=(sub_begin+sub_end)/2; //中间位置 int left_begin,left_end,left_max;int right_begin,right_end,right_max;int cross_begin,cross_end,cross_max;left_max=find_digit_subarray(intputstr,sub_begin,mid,&left_begin,&left_end);right_max=find_digit_subarray(intputstr,mid+1,sub_end,&right_begin,&right_end);cross_max=find_cross_mid(intputstr,sub_begin,mid,sub_end,&cross_begin,&cross_end);if(right_max>=left_max && right_max>=cross_max){*begin=right_begin;*end=right_end;return right_max;}else if(cross_max>=left_max && cross_max>=right_max){*begin=cross_begin;*end=cross_end;return cross_max;}else{*begin=left_begin;*end=left_end;return left_max;}}}unsigned int Continumax(char** pOutputstr, char* intputstr){int len=strlen(intputstr);int begin=0,end=0; //数字串的位置标记 int sub_len_max=0; sub_len_max=find_digit_subarray(intputstr,0,len-1,&begin,&end); char *ptr=(char *)malloc(sub_len_max+1); *pOutputstr=ptr; if(sub_len_max==0) { *(*pOutputstr)=0; return 0; } int k;int m=0;for(k=begin;k<=end;k++){*((*pOutputstr)+m)=*(intputstr+k);m++;}*((*pOutputstr)+m)=0; //终止符 return sub_len_max;}int main(){char* intputstr = "abc12345abc45678abc98765" ;char *pOutputstr = NULL; unsigned int nLength = Continumax(&pOutputstr, intputstr);cout<<nLength<<endl;if(pOutputstr==NULL) cout<<"pout is null"<<endl; else cout<<"not null"<<endl; cout<<"pOutputstr="<<pOutputstr<<endl;free(pOutputstr);}
0 0
- OJ------在字符串中找出连续最长的数字串
- 华为OJ 在字符串中找出连续最长的数字串
- 华为OJ测试--在字符串中找出连续最长的数字串
- 华为oj:在字符串中找出连续最长的数字串
- 华为OJ(在字符串中找出连续最长的数字串)
- 华为oj 在字符串中找出连续最长的数字串
- 华为OJ:在字符串中找出连续最长的数字串
- 华为oj 在字符串中找出连续最长的数字串
- 华为OJ平台——在字符串中找出连续最长的数字串
- 【华为OJ】【087-在字符串中找出连续最长的数字串】
- 华为OJ 初级:在字符串中找出连续最长的数字串
- 华为OJ—— 在字符串中找出连续最长的数字串
- 华为OJ——在字符串中找出连续最长的数字串
- 【华为OJ】在字符串中找出连续最长的数字串
- [华为OJ--C++]087-在字符串中找出连续最长的数字串
- 华为oj初级 在字符串中找出连续最长的数字串
- 在字符串中找出连续最长的数字串 ——来自华为OJ平台测试基础篇
- 华为练习3 在字符串中找出连续最长的数字串
- Oracle中User和Schema之间的区别
- How to hide ImmersiveModeConfirmation
- 使用Delphi声明C++带函数的结构体实战
- POJ 2828 Buy Tickets(神题!线段树or树状数组)
- How to catalog a db2 database
- 华为OJ 在字符串中找出连续最长的数字串
- DataSource Java 官方 DBCP
- Spring Security关于验证提示!
- 在Android中使用HandlerThread创建线程
- 堆 的取最值删除操作和插入操作
- Cocos2d-x对精灵的优化
- 如何将鼠标箭头设置成手型
- Redis,MemCached,MongoDB 概述
- 最美不过少年时,红尘走马,步步相随