XDOJ - 556 连续数字

目录

前言

一、题目描述

二、解题步骤

1.分析

2.代码部分

补充


前言

新人第一次发博客,如果写的不好,请见谅

一、题目描述

大家刚从xdoj过来,可能题目忘记了吧,我这里再把题目重复一遍吧

问题描述

输入一个字符串将连续的数字字符串放到另一个二维数组中 输入格式 输入一个含连续数字的待提取字符串。

输出格式

输出提取出来的数字字符串,每个连续数字字符串占一行。

样例输入

1234abc7654321[][]79869hewl98765 样例输出 1234 7654321 98765 样例说明 79869 不连续,不输出。

评测用例规模与约定

提取出来的连续数字字符串长度不超过 20,输入字符串内至多含有 10 个连续字符串, 时间限制 1s,内存限制 256KB。(注:1287 视为整体,不属于连续数字字符串,不可被看 为是 12 与 87 两个连续数字字符串。单独的数字如 1,视为连续字符串,需要加以输出)

二、解题步骤

1.分析

做任何题目前,切记上来就直接敲代码,一定要分析一下(当然,如果是大佬另说)。

根据题目,我们可以先提取出所有的数字字符串,然后判断他们是否连续(这里可以分成两部分函数,但是我直接放到一起了)。

先找出数字字符串,对于输入字符串(以下称src),应为可能有多个数字字符串在其中,我们建立一个循环来判断每个字符是否是数字,然后复制到二维数组 det 中,这里数组要开大一点,要不然可能会超时。

对于判读连续,要注意不同长度的可能性,考虑长度小于3 和 大于等于3 的情况。同时要注意连续之下的差值,可以先判断差值相等,再利用 abs() 判断差值的绝对值是否为1

2.代码部分

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

void Find(char* src);

int main() {
    char src[1000] = { 0 };
    scanf("%s", src);
    Find(src);
    return 0;
}

void Find(char* src) {//代码主体
    char det[50][50] = { 0 };
    int spos = 0, dpos = 0, count = 0, flag = 0;//flag用来保证count从0开始
    int srclen = strlen(src);
    for (; spos < srclen;) {//这里使用while循环也可以
        if (isdigit(src[spos])) {
            det[count][dpos++] = src[spos++];
            flag = 1; 
        }
        else {
            if (flag) count++;
            while (!isdigit(src[spos]) && spos < srclen) spos++;
            dpos = 0;
        }
    }
    if (isdigit(src[spos - 1])) count++;//这里有一个小补丁

    for (int i = 0; i < count; i++) {//这里判断数字是否连续
        int flag = 1, len = strlen(det[i]), j = 0;
        if (len == 2) {
            if (abs(det[i][j + 1] - det[i][j]) != 1) flag = 0;
        }
        else if (len > 2){
            int diff = det[i][1] - det[i][0];
            for (j = 0; j < len - 1; j++) {
                if (det[i][j + 1] - det[i][j] != diff) {
                    flag = 0;
                    break;
                }
            }
            if (flag && abs(det[i][len - 1] - det[i][len - 2]) != 1) {
                flag = 0;
            }
        }
        if (flag) printf("%s\n", det[i]);
    }
}

补充

在计算有几个数字字符串的部分,我有对src数组的倒二个元素进行判断

    for (; spos < srclen;) {//这里使用while循环也可以
        if (isdigit(src[spos])) {
            det[count][dpos++] = src[spos++];
            flag = 1;
        }
        else {
            if (flag) count++;
            while (!isdigit(src[spos]) && spos < srclen) spos++;
            dpos = 0;
        }
    }
    if (isdigit(src[spos - 1])) count++;//这里有一个小补丁

因为这里我想要count指向二维数组det中第一个空的一维数组,后面才能正确输出。

由于我的count是根据数字字符串后出现的非数字字符来进行递增的,如果src以数字字符结尾,就可能出错。

不过这里可以使用fgets() 函数来代替scanf() 函数,利用它会读取换行符 ‘\n’ 的特性解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值