重新排列日志文件-纯c
2023-09-14 09:06:53 时间
重新排列日志文件-纯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;
}
相关文章
- ctf-web:文件包含漏洞和举例-HCTF2018 WarmUp「建议收藏」
- 【说站】FurMark v1.30绿色单文件版
- 字幕文件srt格式解析
- 【C 语言】文件操作 ( getc 和 putc 函数 )
- JAVA中获取项目文件路径详解编程语言
- 里查找Oracle日志文件:从何处开始?(oracle日志文件在哪)
- Linux中安装.gz文件的简单步骤(linux安装.gz文件)
- Oracle联机日志文件:获取和处理最新信息(oracle联机日志文件)
- Linux 下妙用 CP 命令:复制隐藏文件(linuxcp隐藏文件)
- 探索 Linux 文件系统的不同类型(linux文件的类型)
- 如何解析Oracle数据库日志文件(oracle日志解析)
- Oracle数据库如何删除日志文件(oracle删除日志文件)
- Oracle如何增加redo日志文件的数量?(oracle增加redo)
- linux下利用grep命令搜索文件内容(linuxgrepv)
- MSSQL清除日志文件:实现一键操作(mssql 清除日志文件)
- logMySQL Binlog日志文件分析与管理(%mysql% bin)
- 如何查看Redis日志文件(怎么看redis日志文件)
- 深入浅出解析Redis日志文件(解析redis日志文件)
- Oracle优化减小日志文件尺寸(oracle减小日志文件)
- Oracle事务日志保护重要数据不受破坏(oracle事务日志文件)
- Oracle数据库会话文件理解与利用(oracle会话文件)
- Oracle中处理日志文件的技巧(oracle中日志文件)
- 解析Redis连接日志文件研究(redis 连接日志文件)
- Win2008中SqlServer2008无法打开错误日志文件导致无法启动的解决方法