题解 | #简单错误记录#为什么牛客的题目永远在处理字符串啊
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
#include<stddef.h>
#include<stdbool.h>
#define MAX 100
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include<stdio.h>
int main(){
char ch;
char p[100][100];
int m=0;
int errorRow[100];
char temp[10000];
int templen = -1;
int n = 0;
int cow[100];
//读取所有输入至*temp
while(ch!=EOF&&ch!='#'){
ch = getchar();
if(ch!=EOF&&ch!='#'){
templen++;
temp[templen-1] = ch;
if(temp[templen-1]!='\n'&&temp[templen-1]!=' '){
p[m][n]=temp[templen-1];
//printf("读取 %c 入 %d 行记录位于 %d 列",p[m][n],m,n);
n++;
}else if(temp[templen-1]==' '){
scanf("%d",&errorRow[m]);
//printf("%d 行结束,错误行数为 %d\n",m,errorRow[m]);
cow[m]=n-1;
n=0;
m++;
}else{
continue;
}
}
}
m --;
//将初始每行的错误重复数量设置为1
int errorNum[m+1];
char errorStr[m+1][17];
int errorStrTag[m+1];
memset(errorStrTag,1,(m+1)*sizeof(int));
for(int k = 0;k <= m;k ++){
errorNum[k]=1;
}
//寻找相同的错误
for(int i = 0;i <= m;i ++){
//printf("处理第%d行\n",i);
//提取出每一行错误的倒数前16个字符,遇到'\'便提前终止
//使用数组记录错误文件长度
for(int u = 16;u >= 1;u --){
if(p[i][cow[i]-(16-u)] == '\\'){
//printf("检测到 %c 结束提取文件名\n",p[i][cow[i]-(16-u)]);
errorStrTag[i] = u+1;
//printf("文件名自%d开始",u+1);
break;
}else{
errorStr[i][u] = p[i][cow[i]-(16-u)];
errorStr[i][u-1] = '#';
//printf("提取%c至文件名",p[i][cow[i]-(16-u)]);
errorStrTag[i] = u;
//printf("更新第%d行tag为%d\n",i,errorStrTag[i]);
}
}
}
int flag=1;
for(int i = 0;i <= m;i ++){
for(int j = i + 1;j <= m;j ++){
flag = 1;
//printf("检查第%d行是否与第%d行相同,此时flag为%d\n",i,j,flag);
if(errorRow[i] != errorRow[j]){
//printf("第%d行与第%d行错误行数或者路径长度不相同1\n",i,j);
flag = 0;
}else if(errorStrTag[i] != errorStrTag[j]){
//printf("第%d行与第%d行错误行数或者路径长度不相同2\n",i,j);
flag = 0;
}else{
//printf("第%d行与第%d行错误行数或者路径长度相同尝 试检测完整路径是否相同\n",i,j);
for(int t = errorStrTag[i];t <= 16;t ++){
if(errorStr[i][t]!=errorStr[j][t]){
//printf("第%d行与第%d行完整路径不相同\n",i,j);
flag = 0;
break;
}else{
//printf("%c 与 %c 相同flag为%d \n",errorStr[i][t],errorStr[j][t],flag);
}
}
}
if(flag == 1){
//如果两行错误完全一致,后一个加上前一个的重复数量,将前面一个错误的重复数量调整为0
//printf("第%d行与第%d行错误相同\n",i,j);
errorNum[i] = errorNum[i] +errorNum[j];
errorNum[j] = 0;
}
}
}
//输出最新的八个错误记录
int last8 = 1;
int startlast8;
for(int q = m;q >= 0;q --){
if(last8 > 8||errorNum[q] == 0){
continue;
}else{
last8 ++;
startlast8=q;
}
}
last8 = 1;
for(int d = startlast8;d <= m;d ++){
if(last8 > 8||errorNum[d] == 0){
//只输出八条记录
continue;
}else{
for(int h = errorStrTag[d];h <= 16;h ++){
printf("%c",errorStr[d][h]);
}
printf(" %d %d\n",errorRow[d],errorNum[d]);
last8 ++;
}
}
return 0;
}

