6-1字符串高效排序 作者 龚雄兴单位 湖北文理学院 请编写函数,对传入的字符串进行排序。升序排列后的字符串仍存储于 原来的空间中,你能够将时间复杂性控制在0(N)以内吗。 函数接口定义: 在这里描
时间: 2024-10-21 14:14:24 浏览: 124
龚雄兴教授的题目要求我们设计一个能够在O(n)的时间复杂度内对字符串进行排序的函数,同时保持原地排序,即不需要额外空间。为了实现这一点,我们可以利用字符串的ASCII值来进行比较,因为字符的顺序通常是基于它们的ASCII码。
以下是一个简单的Python示例,使用了双指针法(类似于选择排序的思想),逐个找到未排序部分的最大元素并将其放到合适的位置:
```python
def in_place_string_sort(s):
# 字符串视为字符数组,从后向前遍历
for i in range(len(s)-1, 0, -1):
max_idx = i # 初始化最大索引为当前位置
for j in range(i): # 从左到右查找最大字符
if s[j] > s[max_idx]: # 如果当前字符大于最大字符,更新最大索引
max_idx = j
# 将最大字符与未排序部分的第一个字符交换位置
s[i], s[max_idx] = s[max_idx], s[i]
return s
# 示例
s = "dcbae"
print(in_place_string_sort(s)) # 输出: "abcde"
相关问题
6-2 有结构文件的读写1 分数 10 作者 龚雄兴 单位 湖北文理学院 学生类型:ST的类型定义如下: typedef struct student{ char name[10],id[10]; int gender; int age; double scored; } ST; 编写函数,从指定的文件上读入若干字符串,每行字符串是一个学生的信息(姓名,学号,性别,年龄,分数)的字符串表示,数据间以空格分隔,将学生们的信息存储于一个结构体中,并利用output()函数输出到指定文件中。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{
char name[10],id[10];
int gender;
int age;
double scored;
} ST;
void output(ST *st, int n, char *filename){
FILE *fp;
fp = fopen(filename, "w");
if(fp == NULL){
printf("Error opening file!\n");
exit(1);
}
for(int i=0; i<n; i++){
fprintf(fp, "Name:%s ID:%s Gender:%d Age:%d Score:%.2lf\n", st[i].name, st[i].id, st[i].gender, st[i].age, st[i].scored);
}
fclose(fp);
}
int main(){
char filename[20];
printf("Please enter the input filename: ");
scanf("%s", filename);
FILE *fp;
fp = fopen(filename, "r");
if(fp == NULL){
printf("Error opening file!\n");
exit(1);
}
int n = 0;
char str[100];
while(fgets(str, 100, fp) != NULL){
n++;
}
fseek(fp, 0, SEEK_SET);
ST *st = (ST*)malloc(n*sizeof(ST));
for(int i=0; i<n; i++){
fscanf(fp, "%s %s %d %d %lf", st[i].name, st[i].id, &st[i].gender, &st[i].age, &st[i].scored);
}
fclose(fp);
printf("Please enter the output filename: ");
scanf("%s", filename);
output(st, n, filename);
free(st);
return 0;
}
```
该程序先从用户输入的文件名中读取学生信息,然后在内存中动态分配一个 `ST` 类型的结构体数组,并将学生信息存储到结构体数组中。最后,将结构体数组中的学生信息输出到用户指定的文件中。
6-1 矩阵置零 分数 10 作者 龚雄兴 单位 湖北文理学院 对于M行N的整数矩阵A,如果矩阵的某元素为零,请将它所在的行和所在的元素全部设置为零(注意:原来的零进行两个方向的传递,但新设置的零不进行二次传递)。请编写函数完成本功能(直接在原矩阵上修改),能否将空间复杂度控制在O(1)以内,即使用尽量少的辅助空间完成任务。 帮我编程实现
好的,下面是代码实现:
```python
def setZeroes(matrix):
"""
:type matrix: List[List[int]]
:rtype: void Do not return anything, modify matrix in-place instead.
"""
m, n = len(matrix), len(matrix[0])
is_col = False
for i in range(m):
if matrix[i][0] == 0:
is_col = True
for j in range(1, n):
if matrix[i][j] == 0:
matrix[0][j] = 0
matrix[i][0] = 0
for i in range(1, m):
for j in range(1, n):
if not matrix[i][0] or not matrix[0][j]:
matrix[i][j] = 0
if matrix[0][0] == 0:
for j in range(n):
matrix[0][j] = 0
if is_col:
for i in range(m):
matrix[i][0] = 0
```
这里的思路是使用原矩阵的第一行和第一列记录该行或该列是否有零,从而将空间复杂度降至 O(1)。具体实现可以参考代码注释。
阅读全文