题解 |华为HJ96 #表示数字#
表示数字
https://www.nowcoder.com/practice/637062df51674de8ba464e792d1a0ac6
描述
将一个字符串中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。
数据范围:字符串长度满足 1≤n≤100
输入描述:
输入一个字符串
输出描述:
字符中所有出现的数字前后加上符号“*”,其他字符保持不变
示例1
输入:
Jkdi234klowe90a3
输出:
Jkdi*234*klowe*90*a*3*
#include <stdio.h>
#include <string.h>
//以下是Senky的代码:
//算法写在前面:
//pre_isnum是当前一个元素n[i]的前一个元素是不是数字的判断标记
//①前一个不是数字,当前n[i]是数字,那就要输出‘*’再输出n[i]
//②前一个是数字,当前n[i]不是数字,那也要输出‘*’再输出n[i]
//③前一个是数字,当前n[i]是数字,输出n[i]
//④前一个不是数字,当前n[i]不是数字,输出n[i]
//此算法可以处理前len-1个字符的关系,如果最后一个字符是数字就补一个‘*’
void start() {
char n[100];
scanf("%[^\n]", n);
int len = strlen(n); //字符串长度
int i = 0;//下标从0开始
int pre_isnum = 0;//第一个元素前面默认不是数字,初始化为0
for (i = 0; i < len; i++) {//循环遍历字符串
if (n[i] >= '0' && n[i] <= '9') {//n[i]是数字
if (pre_isnum == 0) printf("*"); //①输出*号
printf("%c", n[i]);//输出n[i]
pre_isnum = 1;//进入下一轮循环时标记置为1
} else {//进入else说明n[i]不是数字
if (pre_isnum == 1) printf("*"); //②输出*号
printf("%c", n[i]);//输出n[i]
pre_isnum = 0;//进入下一轮循环时标记置为0
}
if (i == len - 1 && n[i] >= '0' &&
n[i] <= '9') printf("*"); //处理最后一个字符
}
}
int main() {
start();
return 0;//编辑于2022/10/11
}
解法二代码部分:
#include <stdio.h>
#include <string.h>
//以下是Senky的代码:
//算法写在前面:
//把字母和数字看做两种类型,那么两种类型交接处必定会有'*'
//设计一个函数判断交接处
//①数字 字母: 则输出 n[i-1] * n[i]
//②字母 数字: 则输出 n[i-1] * n[i]
//③数字 数字 || 字母 字母:则先输出n[i-1] n[i]
//依次输出字符,遇到交接面就输出'*'
int is_number(char now) {
int ret = 0; //默认不是数字
if (now >= '0' && now <= '9') ret = 1; //是数字则返回1不是就返回0
return ret;
}
void start() {
char n[100];
scanf("%[^\n]", n);
int len = strlen(n); //字符串长度
int i = 0;//下标从0开始
if (is_number(n[i])) printf("*");//处理第一个字符
for (i = 1; i < len + 1; i++) { //循环遍历字符串
printf("%c", n[i - 1]);//依次输出字符
//异或运算,同0异1,为1是交接面
if (is_number(n[i])^is_number(n[i - 1])) {
printf("*");//输出‘*’
}
}
}
int main() {
start();
return 0;//编辑于2022/10/11
}
总结:
①解法一很妙,有点操作系统信号量机制的味道 ;
②解法二的数组越界的时候判断is_number(n[len])结果为0,即可以认为越界元素不是数字;
③当前帖子仅供自我精进、学习使用,有不足之处欢迎指正;
华为-HJ 文章被收录于专栏
机试的题解
查看4道真题和解析