[华为机试练习题]43.在字符串中找出连续最长的数字串

题目

描述:

请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串;

注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串“1234”的长度就小于数字串“1359055”,如果没有数字,则返回空字符串(“”)而不是NULL!

样例输入

abcd12345ed125ss123058789

abcd12345ss54761

样例输出

输出123058789,函数返回值9

输出54761,函数返回值5

函数原型:

   unsignedint Continumax(char** pOutputstr,  char* intputstr)

输入参数:

   char* intputstr  输入字符串;

输出参数:

   char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串;如果输入字符串是空,也应该返回空字符串;

返回值:

  连续最长的数字串的长度

练习阶段:

初级

代码一

/*---------------------------------------
*   日期:2015-07-03
*   作者:SJF0115
*   题目:在字符串中找出连续最长的数字串
*   来源:华为机试练习题
-----------------------------------------*/
#include <iostream>
#include <stdlib.h>
#include <string>
#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){
    if(intputstr == NULL){
        return 0;
    }//if
    int size = strlen(intputstr);
    *pOutputstr = new char[size+1];
    int start = 0,end = 0,maxStart = 0,maxEnd = 0;
    int max = 0;
    for(int i = 0;i < size;++i){
        // 数字
        int count = 0;
        start = i;
        // 统计连续数字
        while(i < size && intputstr[i] >= '0' && intputstr[i] <= '9'){
            ++i;
            ++count;
        }//if
        // 更新最大值
        if(max <= count){
            max = count;
            maxStart = start;
            maxEnd = i;
        }//if
    }//for
    //输出
    int index = 0;
    for(int i = maxStart;i < maxEnd;++i){
        (*pOutputstr)[index++] = intputstr[i];
    }//for
    (*pOutputstr)[index] = '\0';
    return maxEnd - maxStart;
}

代码二

/*---------------------------------------
*   日期:2015-07-03
*   作者:SJF0115
*   题目:在字符串中找出连续最长的数字串
*   来源:华为机试练习题
-----------------------------------------*/
#include <iostream>
#include <stdlib.h>
#include <string>
#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){
    if(intputstr == NULL){
        return 0;
    }//if
    int size = strlen(intputstr);
    *pOutputstr = new char[size+1];
    int start = 0,end = 0,maxStart = 0,maxEnd = 0;
    int max = 0;
    bool isNum = false;
    for(int i = 0;i <= size;++i){
        // 数字
        if(intputstr[i] >= '0' && intputstr[i] <= '9'){
            ++end;
            isNum = true;
        }//if
        // 非数字
        else{
            if(isNum || i == size){
                if(max <= (end - start)){
                    max = end - start;
                    maxStart = start;
                    maxEnd = end;
                }//if
            }//if
            start = i + 1;
            end = i + 1;
            isNum = false;
        }//else
    }//for
    //输出
    int index = 0;
    for(int i = maxStart;i < maxEnd;++i){
        (*pOutputstr)[index++] = intputstr[i];
    }//for
    (*pOutputstr)[index] = '\0';
    return maxEnd - maxStart;
}
时间: 2024-11-03 18:05:01

[华为机试练习题]43.在字符串中找出连续最长的数字串的相关文章

字符串中找出连续最长的数字字符串的实例代码_C 语言

复制代码 代码如下: //1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, //并把这个最长数字串付给其中一个函数参数outputstr所指内存. //例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789 #include<stdio.

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中

[华为机试练习题]23.修改字符串

题目 描述: 将给定字符串中连续出现3次的小写字母替换为改小写字母在字母表中的下一个字母(z变为a),大写字母和其他字符不处理,仍然保留.要求最终输出的字符串中不再存在任何连续出现3次的小写字母. 例如字符串"ATRcccert893#45ae"经过处理后应该为"ATRdert893#45ae" 详细描述: 接口说明 原型: int ChangeString(char *pInStr,char *pOutStr) 输入参数: char *pInStr 输入字符串 输

[华为机试练习题]3.分解字符串

题目 按要求分解字符串,输入两个数M,N:M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0.例如:输入2,8, "abc" ,"123456789",则输出为"abc00000","12345678","90000000" 代码 /*------------------------------------- * 日期:2015-06-18 * 作者:SJF0115 * 来源:华为机试题 * 题

[华为机试练习题]61.找出字符串中第一个出现次数最多的字符

题目 描述: 找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true 输出成功 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015

[华为机试练习题]49.向升序单向链表中插入一个节点

题目 描述: 输入一个升序单向链表和一个链表节点,向单向链表中按升序插入这个节点. 输入为空指针的情况视为异常,另外不考虑节点值相等的情况. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 详细描述: 接口说明 原型: ListNode* InsertNodeToList(ListNode* pListHead, ListNode* pInsertNode); 输入参数: ListNode* pListHead 单向链表

[华为机试练习题]45.求某二进制数中1的个数

题目 描述: 题目标题: 求某二进制数中1的个数. 给定一个unsigned int型的正整数,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高. 详细描述: 原型: int GetCount(unsigned int num) 输入参数: num 给定的正整数 输出参数(指针指向的内存区域保证有效): 无 返回值: 返回1的个数 举例: 输入13,则对应的二进制是1101,那么1的个数为3个.则:返回3. 练习阶段: 初级 代码 /*--------------------

[华为机试练习题]53.整数相除(AC 但还有bug)

题目 描述: 实现接口: /--------------------------------------------------------------------------------- Description : 整数相除. Input : unsigned int dividend :被除数,取值为无符号整数. unsigned int divisor: 除数,取值为无符号整数. Output : Char *pResult : 运算结果. Return Value : 0:成功: -1

[华为机试练习题]71.一元多项式化简

题目 背景: 编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式. 说明: 多项式由若干个单项式组成,单项式之间为加.减(+,-)关系. 单项式指数字与字母幂的乘积构成的代数式.对一元多项式,字母只有一种. 同类项合并指将多项式中指数相同的单项式,系数经过加减求和,合并为一个单项式.按指数降序指多项式中,单项式按指数从大到小顺序相连. 格式说明 一元多项式输入输出时以字符串形式表示,格式如下 单项式之间用单个加减运算符相连,运算符:+,- 单项式由系数