重新排列日志文件-纯c

重新排列日志文件-纯c

给你一个日志数组 logs。每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 。

有两种不同类型的日志:

字母日志:除标识符之外,所有字均由小写字母组成
数字日志:除标识符之外,所有字均由数字组成

请按下述规则将日志重新排序:

所有 字母日志 都排在 数字日志 之前。
字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序。
数字日志 应该保留原来的相对顺序。

返回日志的最终顺序。

示例 1:

输入:logs = [“dig1 8 1 5 1”,“let1 art can”,“dig2 3 6”,“let2 own kit dig”,“let3 art zero”]
输出:[“let1 art can”,“let3 art zero”,“let2 own kit dig”,“dig1 8 1 5 1”,“dig2 3 6”]
解释:
字母日志的内容都不同,所以顺序为 “art can”, “art zero”, “own kit dig” 。
数字日志保留原来的相对顺序 “dig1 8 1 5 1”, “dig2 3 6” 。

示例 2:

输入:logs = [“a1 9 2 3 1”,“g1 act car”,“zo4 4 7”,“ab1 off key dog”,“a8 act zoo”]
输出:[“g1 act car”,“a8 act zoo”,“ab1 off key dog”,“a1 9 2 3 1”,“zo4 4 7”]

代码实现如下:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

bool re(char *s1,char *s2){
    int i=0;
    int n1;
    int n2;
    int log=0;
    int j;
    // printf("df");
    while(s1[i]!='\0'&&s2[i]!='\0'&&s1[i]!=' '&&s2[i]!=' '){
        if(s1[i]>s2[i]){
             log=1;
             break;
        }
        if(s1[i]<s2[i]){
             log=2;
             break;
        }
        i++;
    }
    

    i=0;
    j=0;

     while(s1[i]!=' '){
       i++;
    }
     while(s2[j]!=' '){
       j++;
    }
   
  int content=0;
  int p1=0;
  int p2=0;
  if(s1[i+1]>='a'&&s1[i+1]<='z'){
      p1=1;
  }
 if(s2[j+1]>='a'&&s2[j+1]<='z'){
      p2=1;
  }
//   printf("df");
//   printf(" %d %d ",p1,p2);
  if(p1>p2) return true;
  if(p1<p2)   return false;
  if(p1==0&&p2==0){
          return true;
  }
  //printf("df");
 // printf("%c %c ",s1[i+1],s2[j+1]);
  if(p2==1&&p1==1){
      while(s1[i]!='\0'&&s2[j]!='\0'){
        if(s1[i]>s2[j]){
             content=2;
             break;
        }
        if(s1[i]<s2[j]){
             content=1;
             break;
        }
        i++;
        j++;
    }
    if(s1[i]=='\0'&&s2[j]!='\0'){
        content=1;
    }
      if(s1[i]!='\0'&&s2[j]=='\0'){
        content=2;
    }
    }
   // printf("%s %s ",s1,s2);
   
    if(content==0&&log==1)return false;
     if(content==0&&log==2)return true;
     if(content==1) return true;
     if(content==2) return false;
     return false;
     


   
}

 void q_sort(char ** logs,int low,int high){
     int l=low;
     int h=high;

      // printf(" start high low %d %d",high,low);
     if(low<high){
       char *str=(char *)malloc(sizeof(char )*100);
        strcpy(str,logs[low]);
     while(low<high){
        //    printf("high low %d %d",high,low);
           // printf("%s %s ",logs[low],logs[high]);
        while(low<high&&re(str,logs[high])){
       
            high--;
         
        }
      //  printf("%d ",re(str,logs[high]));
        if(logs[low]!=logs[high]&&low!=high)
        strcpy(logs[low],logs[high]);
        else break;
         while(low<high&&re(logs[low],str)){
       
            low++;
        }
    
       
         if(logs[low]!=logs[high]&&low!=high)
        strcpy(logs[high],logs[low]);
          else break;
      // printf("dfs");


    }
   strcpy(logs[low],str);
    q_sort(logs,l,low-1);
    q_sort(logs,low+1,h);
     }
     
 }

 
char ** reorderLogFiles(char ** logs, int logsSize, int* returnSize){
    char **str=(char **)malloc(sizeof(char *)*100);
    int i;
     char *t=(char *)malloc(sizeof(char )*1000);
    for(i=0;i<logsSize;i++){
        str[i]=(char *)malloc(sizeof(char)*1000);
         strcpy(str[i],logs[i]);
    }
    int k=0;
    int j;
    for( i=1;i<logsSize;i++){
        for(j=0;j<i;j++){
            if(re(str[j],str[i])){
                continue;
            }
            else{
                 strcpy(t,str[i]);
           //      printf("%s  ",t);
               // printf("%s  ",str[0]);

                for(k=i;k>=j+1;k--){
                    //  printf("adaf %s  ",str[k-1]);
                     strcpy(str[k],str[k-1]);
                }
               //   printf("%s  ",str[1]);
                //  printf("%s ",t);
                 strcpy(str[j],t);

            }


        }
    }
    
   *returnSize=logsSize;
   return str;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值