题解 | #简单错误记录#为什么牛客的题目永远在处理字符串啊

简单错误记录

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;   
}

全部评论
为何无法动态分配内存去扩充数组,只能提前定义一个a[10000]啊,使用realloc会报错
点赞 回复 分享
发布于 2023-03-18 01:02 美国

相关推荐

牛至超人:您好,京东物流岗了解一下吗?负责精加工食品的端到端传输
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务