重新排列日志文件-纯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;
}