C语言初级——练习(三)

C语言初级——练习(三)

11、字母数字混合排序 (吉比特2018秋)

输入一串字符,包含数字[0-9]和小写字母[az],要求按数字从小到大,字母从a到z排序,和所有数字排在字母后面

输入描述:
一串字符
输出描述:
按规则排序的一串字符

示例1
输入
a31bz
输出
abz13

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void* a,const void* b){   //比较函数
    return *(char*)a > *(char*)b;
}
int main(){
    char str[100000];
    //str = fgets();
    scanf("%s",str);
    //int len =  strlen(str);
    int num1=0,num2=0;
    qsort(str,strlen(str),sizeof(str[0]),cmp);    //快速排序,排完序后数字在前字母在后
    for(int i=0;'\0'!=str[i];i++){
        if(str[i]>='a'&&str[i]<='z'){
            printf("%c",str[i]);   //是字母就打印
            //++num1;
        }else if(str[i]>='0'&&str[i]<='9'){  //记录数字出现的次数
            ++num2;
        }
    }
   /* for(int i=num2;i<num1+num2;i++){
        printf("%c",str[i]);
    }*/
    for(int i=0;i<num2;i++){   //将出现的数字打印出来
        printf("%c",str[i]);
    }
    printf("\n");
    return 0;
}
12、转换成小写字母

实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。

示例 1:

输入: “Hello”
输出: “hello”

示例 2:

输入: “here”
输出: “here”

示例 3:

输入: “LOVELY”
输出: “lovely”

//常规做法  大写字母和小写字母的ASCII码相差32  eg:'a'-'A'==32
char * toLowerCase(char * str){
    for(int i=0;'\0'!=str[i];i++){
        if(str[i]>='A'&&str[i]<='Z'){
            str[i]=str[i]+32;
        }
    }
    return str;

}
//使用tolower函数,将大写字母转换为小写字母。
char * toLowerCase(char * str){
     for(int i=0;i<strlen(str);i++)
     {
           str[i]=tolower(str[i]);
     }
     return str;
}
13、最后一个单词的长度

给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

说明: 一个单词是指由字母组成,但不包含任何空格的字符串。

示例:

输入: “Hello World”
输出: 5

//从后往前读,第一个单词即为字符串中的最后一个单词。
int lengthOfLastWord(char * s){
    if(!s||s==" ")return 0;
    int i,j;
    for(i=strlen(s)-1;i>0&&s[i]==' ';i--);
    for(j=i;j>=0&&s[j]!=' ';j--);
    return i-j;   
}
14、仅仅反转字母

给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

示例 1:

输入:“ab-cd”
输出:“dc-ba”

示例 2:

输入:“a-bC-dEf-ghIj”
输出:“j-Ih-gfE-dCba”

示例 3:

输入:“Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”

提示:

S.length <= 100
33 <= S[i].ASCIIcode <= 122
S 中不包含 \ or "

//常规做法:使用ASCII码先将字母取出保存在s中,然后从后往前依次替换S中的字母。
char * reverseOnlyLetters(char * S){
    char s[100];
    int j=0;
    for(int i=0;'\0'!=S[i];i++){
        if(S[i]>='A'&&S[i]<='Z'){
            s[j]=S[i];
            j++;
        }else if(S[i]>='a'&&S[i]<='z'){
            s[j]=S[i];
            j++;
        }
    }
    j=j-1;  //将指针移到最后一个字母位置
    for(int i=0;'\0'!=S[i];i++){
        if(S[i]>='A'&&S[i]<='Z'){
            S[i]=s[j];
            j--;
        }else if(S[i]>='a'&&S[i]<='z'){
            S[i]=s[j];
            j--;
        }
    }
    return S;
}
//使用isalpha函数判断是否为字母。
char * reverseOnlyLetters(char * s){
    int l=0;
    int r=strlen(s)-1;
    char tmp;
    while(l<r)
    {
        if(isalpha(s[l])==0)
        {
             l++;
             continue;
        }
        if(isalpha(s[r])==0)
        {
            r--;
            continue;
        }
        tmp=s[l];
        s[l]=s[r];
        s[r]=tmp;
        l++;
        r--;
    }
    return s;

}
发布了55 篇原创文章 · 获赞 14 · 访问量 3357

猜你喜欢

转载自blog.csdn.net/weixin_41969690/article/details/103787220