数组中的环状串

问题:在一个字符数组中,在不改变数组中元素各位置的情况下,将数组中的字符串由小到大输出。

程序分析:在这个程序中,先遍历直到找到后一个字符比前一个字符小的元素,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('\n');
    }
    getchar();
    getchar();
}

 

posted @ 2016-10-27 15:28  芬乐  阅读(406)  评论(0编辑  收藏  举报