12.28数组去重并排序(c语言)

(一)产生使用冒泡法解决一切问题

 这里明显有两个问题1)数组去重,2)排序

排序当然想到冒泡,快速排序等等方法。

原本打算在冒泡循环中倘若一遇见相等就令其中前一个等于0这样在排序的时候也可以完成去重。

include<stdio.h>
int main() {
	int n,i=0,t=0,m;
	scanf("%d\n", &n);
	int a[1000] = {0};
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for (t = 0; t < n-1; t++) {
		for (i = 0; i<(n-1-t); i++) {
			if (a[i] == a[i + 1]) {
				a[i] = 0; 
			}
			if (a[i] > a[i+1]);
				{m = a[i]; a[i] = a[i + 1]; a[i + 1] = m; }
		}
	}
	for (i = 0; i < n; i++) {
		if (a[i] != 0) {
			printf("%d ",a[i]);
		}
	}
	return 0;
}

                                        (原本使用函数,我改成一段比较好看一点)

但是发现无法得出正确答案只是出现去重实现了,排序只排了一部分的序。至于问题在哪一直没找到。知道的 兄弟就帮我纠出问题!!!

(二)

题目限制的数字大小为1<=x<=1000,此时设置的数组也设这么大的话,那么我们存到数组里面的所有数字都由小到大的排好了位子,则我们需要借助数组本身的数字大小完成排序。

与此同时,如果这样的话,重复的数字也会被重复而抵消掉。然后其他空的位置都是被赋予0,那么输出的时候就只输出有数字的数组。


int main()
{
    int n = 0;
    int arr[1001] = {0};
    int tmp = 0;
    scanf("%d\n",&n);
    int i = 0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&tmp);
        arr[tmp] = tmp;
    }
    for(i=0;i<1001;i++)
        {
            if(arr[i] != 0)
                printf("%d ",i);
        }
    return 0;
}

如图,奇妙的很!!!!!!!!!!

继续努力学习

<think>我们需要遍历指定目录下的文件,找出符合"Exercisei_j"模式的文件(其中i和j是数字)。对于每个匹配的文件名,我们检查i部分(即下划线前的数字)是否是个位数。如果是个位数,则在前面补0,形成新的文件名。注意:我们只命名符合模式的文件,其他文件不变。步骤:1.指定要操作的目录(可以是固定路径,也可以由用户输入)。2.获取该目录下的所有文件名。3.使用正则表达式匹配文件名模式:以"Exercise"开头,接着是一串数字(i),然后是一个下划线,再接着一串数字(j),可能有文件扩展名。4.对于匹配的文件,提取i和j部分。如果i是个位数(即长度只有1),则将其改为两位数(前面补0),然后构建新的文件名。5.命名文件。注意:命名时要注意文件扩展名的处理。假设文件名格式为:Exercise<数字>_<数字>.<扩展名>或者Exercise<数字>_<数字>(无扩展名)我们使用正则表达式:^Exercise(\d+)_(\d+)(\..*)?$但是,我们只关心i(第一个数字)部分,所以需要捕获第一个数字序列。具体步骤:-遍历目录中的每个文件。-使用正则表达式匹配文件名。-如果匹配,检查第一个数字组(i)的长度是否为1,如果是,则补0。-构造新文件名:如果原文件有扩展名,则新文件名为"Exercise"+补0后的i+"_"+j+扩展名;如果没有扩展名,则不加。在Java中,我们可以使用File类的listFiles方法获取文件列表,然后使用String的matches方法进行正则匹配,使用replaceAll或者分组提取。但是,由于正则表达式需要分组,我们可以使用Pattern和Matcher。例如,文件名:Exercise2_1.txt分组1:2分组2:1分组3:.txt新文件名:Exercise02_1.txt代码实现:我们将编写一个程序,可以指定目录路径,然后进行命名。注意:命名操作需要谨慎,最好先打印出命名前后的文件名,确认无误后再执行命名。因此,我们可以先模拟运行(只打印不命名),然后让用户确认后再执行实际的命名。但是,题目要求是编写程序直接命名。为了安全起见,我们也可以先备份文件?或者我们可以先在一个测试目录下运行。这里,我们假设用户已经确认目录正确,且程序在正确的目录下运行。为了安全,我们可以先打印出将要命名的文件,然后询问用户是否继续。不过,根据题目要求,我们直接编写命名程序。但为了保险,我们可以在命名之前先检查新文件名是否已经存在,避免覆盖。步骤:1.获取目录路径(这里我们使用固定路径,或者通过命令行参数传入)。2.列出目录下的所有文件。3.遍历每个文件,检查文件名是否符合模式。4.如果符合,提取各部分,判断第一个数字部分是否是个位数(长度为1)。5.如果是,构建新文件名(第一个数字部分前面补0)。6.检查新文件名是否已经存在,如果存在则跳过(避免覆盖),否则命名。代码结构:-使用File对象表示目录。-获取目录下的文件列表。-定义正则表达式模式:Pattern.compile("^Exercise(\\d+)_(\\d+)(\\..*)?$");-遍历每个文件,用Matcher匹配文件名(注意:不包含路径,所以取文件名)。-如果匹配,则检查第一个数字组(group(1))的长度是否为1,如果是则补0。-构建新文件名:如果没有扩展名,则新文件名为"Exercise0"+group(1)(当group(1)长度为1)+"_"+group(2);如果有扩展名,则加上group(3)。但是注意:如果group(1)长度于1,则不需要补0。所以只有当长度为1时才补0。注意:如果i部分本来就是多位数(如12),则不需要改变。具体代码实现如下:</think>以下是一个Java程序,用于命名指定目录中符合特定模式的文件名: ```java import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ExerciseRenamer { public static void main(String[] args) { // 设置要处理的目录路径(修改为你的实际路径) File directory = new File("C:/path/to/your/directory"); if (!directory.isDirectory()) { System.out.println("指定路径不是目录或不存在"); return; } // 正则表达式匹配模式:Exercise后跟数字,下划线,再跟数字 Pattern pattern = Pattern.compile("Exercise(\\d)_(\\d.*)"); File[] files = directory.listFiles(); if (files == null) return; for (File file : files) { String oldName = file.getName(); Matcher matcher = pattern.matcher(oldName); if (matcher.find()) { // 提取各部分:第一个数字、下划线后的部分 String firstNum = matcher.group(1); String rest = matcher.group(2); // 构建新文件名(在个位数前补0) String newName = "Exercise0" + firstNum + "_" + rest; File newFile = new File(directory, newName); // 执行命名操作 if (file.renameTo(newFile)) { System.out.println("命名成功: " + oldName + " -> " + newName); } else { System.out.println("命名失败: " + oldName); } } } } } ``` ### 代码解释: 1. **目录设置**: ```java File directory = new File("C:/path/to/your/directory"); ``` 替换路径为实际目录路径(使用正斜杠或双反斜杠) 2. **正则表达式**: ```java Pattern pattern = Pattern.compile("Exercise(\\d)_(\\d.*)"); ``` - `Exercise`:匹配固定前缀 - `(\\d)`:捕获第一个数字(单个数字) - `_`:匹配下划线 - `(\\d.*)`:捕获下划线后的数字及剩余部分 3. **文件名处理逻辑**: - 遍历目录中所有文件 - 使用正则匹配文件名 - 提取第一个数字(`group(1)`)和剩余部分(`group(2)`) - 构建新文件名:`"Exercise0" + 原数字 + "_" + 剩余部分` 4. **命名操作**: ```java file.renameTo(newFile) ``` 执行实际的文件命名,返回布尔值表示成功与否 ### 使用注意事项: 1. **路径格式**: - Windows:`"C:/Users/Name/Documents"` 或 `"C:\\Users\\Name\\Documents"` - Linux/Mac:`"/home/user/documents"` 2. **文件名要求**: - 必须严格符合`Exercise<单个数字>_<剩余内容>`格式 - 示例有效文件名: - `Exercise2_1.java` - `Exercise5_test.txt` - `Exercise3_` 3. **运行权限**: - 程序需要对目录有读写权限 - 不能在IDE中直接运行时,需检查工作目录设置 4. **安全建议**: - 首次运行时建议备份文件 - 可添加检查防止复补0(如检测`Exercise02`已存在时不修改) ### 示例效果: | 原始文件名 | 新文件名 | |------------------|------------------| | `Exercise2_1.java` | `Exercise02_1.java` | | `Exercise5_test.txt` | `Exercise05_test.txt` | | `Exercise3_` | `Exercise03_` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值