一. 牛客网华为机试题
13. 句子逆序
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
数据范围:输入的字符串长度满足 1≤n≤1000 1≤n≤1000
注意本题有多组输入
输入描述:输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
输出描述:得到逆序的句子
示例1
输入:I am a boy
输出:boy a am I
代码实现如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int i = 0,len = 0;
int cnt = 0;
char buf1[1001] = {0};
char buf2[1001] = {0};
char* ptr = NULL;
fgets(buf1, sizeof(buf1), stdin);
len = strlen(buf1)-1;
ptr = buf1+len-1;
while(ptr != buf1)
{
if(*ptr != ' ')
{
cnt++;
}
else
{
memcpy(&buf2[i], ptr+1, cnt);
buf2[i+cnt] = ' ';
i += cnt+1;
cnt = 0;
}
ptr--;
}
memcpy(&buf2[i], ptr, cnt+1); //拷贝第一个字符串
printf("%s", buf2);
return 0;
}
14. 字符串排序
给定 n 个字符串,请对 n 个字符串按照字典序排列。
数据范围: 1≤n≤1000 1≤n≤1000 ,字符串长度满足 1≤len≤100 1≤len≤100
输入描述:输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:数据输出n行,输出结果为按照字典序排列的字符串。
代码实现如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int n = 0;
int i = 0, j = 0;
scanf("%d", &n); //输入字符串的个数
char str[n][101];
char tmp[101] = {0};
for(i=0; i<n; i++)
scanf("%s", str[i]);
for(i=0; i<n; i++)
{
for(j = i+1; j< n; j++)
{
if(strcmp(str[i], str[j]) > 0)
{
strcpy(tmp, str[i]);
strcpy(str[i],str[j]);
strcpy(str[j], tmp);
}
}
}
for(i=0; i<n; i++)
{
printf("%s\n", str[i]);
}
return 0;
}
15. 求int型正整数在内存中存储时1的个数
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内
输入描述:输入一个整数(int类型)
输出描述:这个数转换成2进制后,输出1的个数
代码实现如下:
#include <stdio.h>
int main(int argc, char* argv[])
{
int n=0;
int i=0, cnt=0;
scanf("%d", &n);
for(i=0; i<32; i++)
{
if((n & 0x01) == 1)
{
cnt++;
}
n = n>>1;
}
printf("%d", cnt);
return 0;
}