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;
}