目录
前言
新人第一次发博客,如果写的不好,请见谅
一、题目描述
大家刚从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’ 的特性解决