【华为OD机试真题 C语言】2、 在字符串中找出连续最长的数字串含+-号 | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
    • 二、思路参考
    • 三、代码参考
      • C语言
  • 作者:KJ.JK


个人博客首页: KJ.JK
 
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

一、题目


题目描述

请在一个字符串中找出连续最长的数字串,并返回这个数字串。
如果存在长度相同的连续数字串,返回最后一个。
如果没有符合条件的字符串,返回空字符串””。
 
注意:
数字串可以由数字”0-9″、小数点”.”、正负号”±”组成,长度包括组成数字串的所有符号。
“.”、“±”仅能出现一次,”.”的两边必须是数字,”±”仅能出现在开头且其后必须要有数字。
长度不定,可能含有空格


输入输出

输入
1234567890abcd9.+12345.678.9ed
 
输出
+12345.678


二、思路参考

  1. findLongestNumberString 函数用于查找最长数字串。它接受一个字符串作为输入,并返回找到的最长数字串
  2. 函数中定义了变量 length,存储输入字符串的长度,以及 start 和 end,存储最长数字串的起始和结束索引
  3. 遍历输入字符串的每个字符,从左到右进行处理
  4. 如果当前字符是数字(0-9),或者是正负号(+/-),则更新当前数字串的起始索引 currentStart 和结束索引 currentEnd
  5. 如果当前字符是小数点(.),则检查前一个数字串是否已经开始,并且当前数字串的结束索引大于小数点的位置。如果满足条件,则更新当前数字串的结束索引为小数点的位置
  6. 如果当前字符不是数字、正负号或小数点,则表示当前数字串已经结束。检查当前数字串的长度是否大于等于最长数字串的长度,如果是,则更新最长数字串的起始索引 start 和结束索引 end,并重置当前数字串的起始索引 currentStart 和结束索引 currentEnd
  7. 在整个遍历过程中,通过 hasDot 和 hasSign 两个标志变量来记录是否已经遇到过小数点和正负号,用于限制它们的出现次数。
  8. 最后,根据最长数字串的起始索引 start 和结束索引 end,提取出最长数字串的部分,并动态分配内存来存储结果字符串。如果没有找到数字串,则返回空字符串。

三、代码参考


C语言


#include 
#include 
#include 

char* findLongestNumberString(char* str) {
    int length = strlen(str);
    int start = -1, end = -1;
    int maxLength = 0;
    int currentStart = -1, currentEnd = -1;
    int hasDot = 0;
    int hasSign = 0;

    for (int i = 0; i < length; i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            if (currentStart == -1)
                currentStart = i;
            currentEnd = i;
        } else if (str[i] == '+' || str[i] == '-') {
            if (currentStart == -1 && !hasSign && (i + 1 < length) && (str[i + 1] >= '0' && str[i + 1] <= '9')) {
                hasSign = 1;
                currentStart = i;
                currentEnd = i;
            } else {
                if (currentStart != -1) {
                    int currentLength = currentEnd - currentStart + 1;
                    if (currentLength >= maxLength) {
                        maxLength = currentLength;
                        start = currentStart;
                        end = currentEnd;
                    }
                    currentStart = -1;
                    currentEnd = -1;
                }
                hasDot = 0;
                hasSign = 0;
            }
        } else if (str[i] == '.') {
            if (currentStart != -1 && !hasDot && (i + 1 < length) && (str[i + 1] >= '0' && str[i + 1] <= '9')) {
                hasDot = 1;
                currentEnd = i + 1;
            } else {
                if (currentStart != -1) {
                    int currentLength = currentEnd - currentStart + 1;
                    if (currentLength >= maxLength) {
                        maxLength = currentLength;
                        start = currentStart;
                        end = currentEnd;
                    }
                    currentStart = -1;
                    currentEnd = -1;
                }
                hasDot = 0;
                hasSign = 0;
            }
        } else {
            if (currentStart != -1) {
                int currentLength = currentEnd - currentStart + 1;
                if (currentLength >= maxLength) {
                    maxLength = currentLength;
                    start = currentStart;
                    end = currentEnd;
                }
                currentStart = -1;
                currentEnd = -1;
            }
            hasDot = 0;
            hasSign = 0;
        }
    }

    if (start != -1 && end != -1) {
        int resultLength = end - start + 1;
        char* result = malloc(sizeof(char) * (resultLength + 1));
        strncpy(result, str + start, resultLength);
        result[resultLength] = '\0';
        return result;
    } else {
        return "";
    }
}

int main() {
    char str[] = "1234567890abcd9.+12345.678.9ed";
    char* longestNumberString = findLongestNumberString(str);
    printf(longestNumberString);
    free(longestNumberString);
    return 0;
}

作者:KJ.JK

你可能感兴趣的:(华为OD机试真题(C语言),c语言,在字符串中找出连续最长的数字串,华为od机试真题)