问题:在一个字符数组中,在不改变数组中元素各位置的情况下,将数组中的字符串由小到大输出。
程序分析:在这个程序中,先遍历直到找到后一个字符比前一个字符小的元素,less函数就立马返回true,然后让ans+1,main函数中的第一个for循环继续进行迭代执行less函数,知道将ans的值加到
之前寻找到的哪个“后一个字符”的下标,然后继续迭代,这时比较的就是"后一个字符"后面还有没有比它还小的字符了,如果有,会将ans的值一直加到该最小字符的下标。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #define maxn 105 //环状串s的表示法p是否比表示法q的字典序小 int less(const char* s, int p, int q) { int n = strlen(s); for (int i = 0; i < n; i++) //我做的实验是for语句下面的return 0语句只有在for语句执行完之后才会执行。哪怕if语句不满足条件也不会执行下面的return语句。 if (s[(p + i) % n] != s[(q + i) % n]) return s[(p + i) % n] < s[(q + i) % n]; return 0; //相等 } int main() { int T; char s[maxn]; scanf("%d", &T); while (T--) { scanf("%s", s); int ans = 0; int n = strlen(s); for (int i = 1; i < n; i++) if (less(s, i, ans)) ans = i; for (int i = 0; i < n; i++) putchar(s[(i + ans) % n]); putchar(' '); } getchar(); getchar(); }