题解 | #字符串排序#

字符串排序

https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584

//字符串排序
#include <stdio.h>
#include <string.h>
int TypeofChar(char val) {
    if (val >= 65 && val <= 90) return 1;
    if (val >= 97 && val <= 122) return 2;
    return 0;
}

int main() {
    char str[1000];//="A Famous Saying: Much Ado About Nothing (2012/8).";
    gets(str);
    //printf("%s",str);
    int length = strlen(str);
    //又是冒泡的感觉

    // for(int i=1;i<length;i++)
    // {
    //     int curtype=TypeofChar(str[i]);
    //     int prevtype=TypeofChar(str[i-1])
    //     if(curtype=1)
    // }
    char result[length + 1];
    result[length]=0;//结束符赋值
    char* searchbegin = str;
    char findchr = 'A';
    //不需要,我就直接每个字母找一遍
    for (int i = 0; i < length; i++) {
        //首先还是先固定下来非英文字符的位置
        int curtype = TypeofChar(str[i]);
        if (curtype == 0) {
            result[i] = str[i];
            continue;
        }
        //同时找findchr的大小写,若均找到则返回指针

        //int checknum=0;
        while (findchr <= 'Z' &&
                searchbegin != NULL) { //searchbegin!=NULL 这个条件似乎不需要
            char* smaletter = strchr(searchbegin, findchr + 32);
            char* capletter = strchr(searchbegin, findchr);
            // 根据指针位置判断谁在前,赋值给当前result[i]
            if (smaletter != NULL) {
                if (capletter != NULL) { //大小写均出现
                    if (capletter - smaletter > 0) { //小写在前
                        result[i] = findchr + 32;
                        searchbegin = smaletter + 1;
                        // checknum=1;
                        break;
                    } else {
                        result[i] = findchr;
                        searchbegin = capletter + 1;
                        // checknum=1;
                        break;
                    }
                } else { //只出现小写
                    result[i] = findchr + 32;
                    searchbegin = smaletter + 1;
                    //  checknum = 1;
                    break;
                }

            } else if (capletter != NULL) { //只出现大写
                result[i] = findchr;
                searchbegin = capletter + 1;
                // checknum = 1;
                break;
            } else { //均未搜到
                findchr++;
                searchbegin = str;
            }

        }
        //if(checknum==1)
    }
    printf("%s", result);
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务