在字符串中找出连续最长的数字串 ——来自华为OJ平台测试基础篇



/*
 * 在字符串中找出连续最长的数字串
 * 描述:  样例输出
 * 输出123058789,函数返回值9
 * 输出54761,函数返回值5
 * 接口说明
 * 函数原型:
 * unsignedint Continumax(char** pOutputstr,  char* intputstr)
 * 输入参数:
 * char* intputstr  输入字符串;
 * 输出参数:
 * char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串;如果输入字符串是空,也应该返回空字符串; 
 * 返回值:
 * 连续最长的数字串的长度
 * 知识点:  位运算 
 * 题目来源:  内部整理 
 * 练习阶段:  初级 
 * 运行时间限制: 10Sec
 * 内存限制: 128MByte
 * 输入: 
 * 输入一个字符串。 
 * 输出: 
 * 输出字符串中最长的数字字符串和它的长度。
 * 如果数字字符串为空,则只输出0
 * 如 input: dadfsaf  output:0
 * 样例输入: abcd12345ed125ss123058789                    
 * 样例输出: 123058789,9
*/
#include <iostream>
#include <string>
#include <vector>
#include <string.h>
#include <map>

using namespace std;

void Input(std::string &str);
unsigned int Continumax(char** pOutputstr,  char* intputstr);

struct MyPairs
{
 char digit;
 int position;
};

int main()
{
 std::string InputString;
 char* intputstr;
 char* pOutputstr = NULL;

 Input(InputString);

 intputstr = const_cast<char*>(InputString.c_str());

 int flag = static_cast<int>(Continumax(&pOutputstr,intputstr));

 if(flag>0)
 {
  std::cout << pOutputstr << ',' << flag<<endl;

  delete[] pOutputstr;
  pOutputstr = NULL;

 }
 else if(flag==0)
 {
  std::cout << flag << endl;
 }
 else
 {
  return -1;
 }
 
 system("pause");

 return 0;
}

void Input(std::string &str)
{
 getline(std::cin,str,'\n');

 return;
}

unsigned int Continumax(char** pOutputstr,  char* intputstr)
{
 vector<MyPairs> DigitSubString;
 vector<vector<MyPairs>> AllDigitSubString;
 vector<vector<MyPairs>>::iterator iter;
 int size = strlen(const_cast<const char*>(intputstr));
 char c;
 int pre = -1;

 /* 输入字符串为空字符串 */
 if(size==0)
 {
  char* NullStr = "";
  *pOutputstr = NullStr;

  return -1;
 }

 /* 将所有的数字字符及其序号存入vector中 */
 for(int i=0;i<size;i++)
 {
  c = intputstr[i];

  if((c>=48) && (c<=57))
  {
   /* 数字字符连续 */
   if(i==(pre+1))
   {
    MyPairs pp;
    pp.digit = c;
    pp.position = i;
    DigitSubString.push_back(pp);
    pre= i;
   }
   else
   {
    /* vector不为空 */
    if(!(DigitSubString.empty()))
    {
     AllDigitSubString.push_back(DigitSubString);
    }

    DigitSubString.clear(); /* 清空vector */

    /* 再将该数字字符插入新的vector中 */
    MyPairs pp;
    pp.digit = c;
    pp.position = i;
    DigitSubString.push_back(pp);
    pre = i;
   }
  }
 }

 AllDigitSubString.push_back(DigitSubString);

 int maxlen = 0;
 int vector_num = -1;
 int ipp = 0;

 /* 找出最长数字字符串所在的vector */
 for(iter=AllDigitSubString.begin();iter!=AllDigitSubString.end();iter++)
 {
  int LL = iter->size();

  if(LL>maxlen)
  {
   maxlen = LL;
   vector_num = ipp;
  }
  ipp++;
 }

 /* 连续最长的数字字符串长度为0 */
 if(maxlen==0)
 {
  char* NullStr = "";
  *pOutputstr = NullStr;

  return 0;
 }

 vector<MyPairs> MaxVector = AllDigitSubString[vector_num];
 vector<MyPairs>::iterator Maxiter;

 int ppp =0;
 char* substr = new char[maxlen+1];

 for(Maxiter=MaxVector.begin();Maxiter!=MaxVector.end();Maxiter++)
 {
  char ccc = intputstr[Maxiter->position];
  substr[ppp] = ccc;
  
  ppp++;
 }

 char kp = '\0';
 substr[ppp] = kp;
 *pOutputstr = substr;

 return maxlen;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值