E.字符串排序(每个操作都得到新字符串,按字典排序)

算是把sort函数玩明白了

 

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int n, k;         //n是字符串长度,k表示第k次操作
string a;         //就是输入的字符串
string* ss;       //用来装每次操作之后的a
string* operate;  //存放操作说明,比如1 0 2 e
int iii;

//算出来的新字符串放到ss里面
string fun(string x) {           //x是操作说明,比如1 0 2 e      都是字符,x[1]=' '
	//1就是替换
	if (x[0] == '1') {
		string temp = a;
		if (x[2] != '0') {
			temp = fun(operate[int(x[2]) - int('1')]);   //x[2]可以取0,1,2,3……
		}
		temp[int(x[4]) - int('1')] = x[6];
		return temp;
	}
	//2就是删除,然后补位
	else if (x[0] == '2') {
		string temp = a;      //先初始化为a
		string afterward;
		if (x[2] != '0') {
			temp = fun(operate[int(x[2]) - int('1')]);   //x[2]可以取0,1,2,3……   temp回来比如说是aca
		}
		afterward = temp.substr(int(x[4]) - int('0'), sizeof(temp));
		string beyond = temp.substr(0, (int(x[4]) - int('1')));
		return beyond + afterward;
	}
}

bool sort_by_oder(const string& x, const string& y) {         //返回true的时候,就会把x放在前面
	if (iii == 0 || (x.length() > iii + 8 && y.length() > iii + 8 && x[iii - 1] == y[iii - 1])) {
		if (x[iii] < y[iii]) {
			return true;
		}
	}
	return false;
}

bool sort_by_size(const string& x, const string& y) {
	if (x.length() < y.length()) {
		return true;
	}
	return false;
}
void sort_string() {
	for (int i = 0; i < k; i++) {
		ss[i] += "00000000000" + to_string(i + 1);
	}
	sort(ss, ss + k, sort_by_size);         //先按大小排序,再按字母顺序排序

	for (iii = 0; iii < n; iii++) {         //每个位置都给排序一遍,第一个位置不一样的就不参与第二个位置的排序。
		sort(ss, ss + k, sort_by_oder);
	}
	for (int i = 0; i < k; i++) {
		//cout << ss[i] << "  " << ss[i].length() << endl;
		cout << ss[i][ss[i].length() - 1]<<" ";
	}
}

int main() {
	cin >> n >> a >> k;
	ss = new string[k];
	operate = new string[k];
	cin.get();					//不写的话getline会以为上一个回车是自己的,什么毛病这是。。。
	for (int i = 0; i < k; i++) {
		getline(cin, operate[i]);
	}
	for (int i = 0; i < k; i++) {
		ss[i] = fun(operate[i]);
	}
	sort_string();

	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要对n个字符串按照字典顺序进行排序,可以使用C标准库中的qsort函数,并编写一个自定义的比较函数。以下是一个示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 100 // 最大字符串长度 #define MAX_NUM 100 // 最大字符串数量 int cmp(const void *a, const void *b) { return strcmp(*(const char **)a, *(const char **)b); } int main(void) { char *strs[MAX_NUM]; // 存储指向字符串的指针 int n; // 字符串数量 // 读入字符串 printf("请输入字符串数量:"); scanf("%d", &n); printf("请输入%d个字符串(每行一个):\n", n); for (int i = 0; i < n; i++) { char *str = (char *)malloc(MAX_LEN * sizeof(char)); // 分配字符串内存 scanf("%s", str); strs[i] = str; // 记录指针 } // 排序 qsort(strs, n, sizeof(char *), cmp); // 输出结果 printf("按字典顺序排序后的结果为:\n"); for (int i = 0; i < n; i++) { printf("%s\n", strs[i]); free(strs[i]); // 释放字符串内存 } return 0; } ``` 在上述程序中,我们定义了一个自定义的比较函数cmp,它接受两个指向字符串的指针,使用strcmp函数进行比较并返回比较结果。然后在主函数中,我们使用指针数组strs存储指向字符串的指针、读入字符串、调用qsort函数进行排序、输出结果,并在最后释放字符串内存。需要注意的是,在使用malloc函数分配字符串内存后,需要在程序结束前使用free函数释放内存,以免出现内存泄漏的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值