1. PTA天梯赛30题,类似双指针(索引i、j)遍历,
因为题目要求输出顺序i优先,所以i不回溯,而如果不匹配则需要移动j,导致可能跳过跟当前i不匹配,但是跟i++匹配的结果,所以每次匹配成功后,需要把j回溯到n-1(最右)处,通过visited位来跳过已经处理过的元素
int i = 0; int j = n - 1; while (i<j) { if (stu[i].sex != stu[j].sex && !stu[j].visited) { printf("%s %s\n", stu[i].name, stu[j].name); stu[j].visited = 1; // i不回溯,j回溯防止漏掉,通过visited位跳过 i++; j = n - 1; } else { j--; } }2.
对于个数容量未知能用静态内存的大数组(一、二维都行)就用,更简单直接省时间,动态扩容尽量不要用!
只有题目给定了输入的容量,才用动态分配!
3.
hot100,回溯/全排列
根据字符串123生成字符的所有排列组合,通过回溯法
#include <stdio.h> #include <string.h> int count = 0; // 记录排列个数(你的变量名) char temp[100] = {0}; // 临时拼接排列,初始化为0(自动补\0) // 你的gesort函数(修复核心问题) void gesort(char* str, char res[50][100], int* visited, int step) { int len = strlen(str); // 原字符串长度 // 终止条件:排列拼接完成 if (step == len) { temp[step] = '\0'; 关键:补字符串结束符表示新拼接字符序列的结束 strcpy(res[count], temp); // 复制到结果数组 count++; // 排列数+1 return; } // 遍历所有字符,选未使用的 for (int i = 0; i < len; i++) { if (visited[i] == 0) { // 未使用的字符 temp[step] = str[i]; 不用清空,会覆盖旧的拼接数据! visited[i] = 1; // 标记已使用 gesort(str, res, visited, step + 1); // 递归拼下一位 visited[i] = 0; // 回溯:恢复未使用 } } } void main() { char str[100]; // 你的变量名 printf("请输入要生成排列的字符串(如123):"); scanf("%s", str); // 输入字符串 int visited[100] = {0}; // 你的变量名,初始全0 char res[50][100] = {0}; // 你的变量名,初始全0(避免乱码) count = 0; // 重置计数(防止全局变量残留) // 调用函数:直接传res(不再强制类型转换,避免错误) gesort(str, res, visited, 0); // 打印结果(核心:确保有输出) if (count == 0) { printf("未生成任何排列!\n"); } else { printf("\n生成的排列总数:%d\n", count); printf("所有排列:\n"); for (int i = 0; i < count; i++) { printf("%d: %s\n", i+1, res[i]); } } }