C 语言试题
- 设计一个函数:给你一个字符串 x ,如果 x 是一个回文字符串,返回 true ;否则,返回 false 。回文字符串是指正序(从左向右)和倒序(从右向左)读都是一样的字符串。例如,121 是回文,而 123 不是。
#include<stdio.h>
#include<string.h>
bool huiwen(char* a){
int i=0,j= strlen(a)-1;
while (a[i++] == a[j--]);//(关键代码)如果左右对称,i最终会大于j
if (i > j)return true;//是回文
else return false;//不是回文
}
int main() {
char a[100];
scanf("%s", a);
if (huiwen(a))
printf("true");
else
printf("false");
return 0;
}
- 设计一个函数:给定一个英文句子字符串,句子包含若干个单词,每个单词间有一个空格。现在你需要将句子中的每个单词逆置,然后返回单词逆置后的句子(不改变之前单词的顺序,可以修改给定的字符串)。样例:
输入样例1
Who Love Solo
返回样例1
ohW evoL oloS
#include<stdio.h>
#include<string.h>
#include<malloc.h>
char* reverse(char* a) {
int i = 0,j=0,len = strlen(a);
char *b = (char*)malloc((sizeof(a)/4)*len);//新建一个等长
//的数组
while (i++<len) {
if (a[i] == ' ') {//遇空格先反转
int k = i-1;
while (j < i) {
b[j++] = a[k--];//将数组从后到前赋值给新数组实现反转
}
b[j++] = ' ';
}
if (i == len-1) {
int k = i;
while(a[k] != ' '&&k>=0)
b[j++] = a[k--];
}
}
return b;
}
int main() {
char a[] = "HHHHHHBBBBBAAAA";
char *b = reverse(a);
for (int i = 0; i < strlen(a); i++) {
printf("%c", b[i]);
}
return 0;
}
- 设计一个函数:对给定的整形数组 A ,及其长度 S, 对 A进行升序排列。
样例1
A=[ 2,10,6,8,9] ,S=5
排序后
A=[2,6,8,9,10]
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b) {//比较函数
int *p = (int*)a;
int *q = (int*)b;
return (*p > *q);
}
void upsort(int *A,int S) {//接口
qsort(A,S,sizeof(int),cmp);//快排
}
int main() {
int a[] = { 2,10,6,8,9,44,88,21,36 };
int len = sizeof(a) / sizeof(a[0]);
upsort(a, len);
for(int i=0;i< len;i++)
printf("%d ", a[i]);
return 0;
}
- 设计一个函数: 对给定的正整数 n,求 斐波那契数列 的第n项的数值。
斐波那契数列指的是这样一个数列:
0,1,1,2,3,5,8…
这个数列从第3项开始,每一项都等于前两项之和。
#include<stdio.h>
int fibonacen(int n) {
if (n == 1)
return 0;//从第一项为0开始
else if (n == 2)
return 1;
else
return fibonacen(n - 1) + fibonacen(n - 2);//第三项为前两项相加
}
int main() {
int n = 5;
printf("%d\n", fibonacen(5));
return 0;
}
- 设计一个函数(数组去重): 给你一个有序数组 nums ,请你删除重复出现的元素,使每个元素 只出现一次 ,返回删除后的新数组。
#include<stdio.h>
int* DeleteRepetition(int *a, int len) {
for (int i = 0; i < len-1; i++) {
if (a[i] == a[i + 1]) {
a[i] = -1;//此处赋值为删除操作,因为c语言数组长度固定
}
}
return a;
}
int main() {
int nums[] = { 1,1,1,2,2,3,3,4,4,5,7 };
int len = sizeof(nums) / sizeof(int);
int *numss = DeleteRepetition(nums,len);
for (int i = 0; i < len; i++) {
if (numss[i] == -1)continue;
printf("%d ", numss[i]);
}
return 0;
}
- 设计一个函数: 给定一个非负整数 numRows,输出杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和上方的数的和。
示例:
#include<stdio.h>
#include<malloc.h>
void Yanghui(int a) {
int **arr = (int **)malloc(sizeof(int *)*a);
for (int i = 0; i < a; i++) {
arr[i] = (int *)malloc(sizeof(int)*a);
}
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++) {//观察可得第一列和对角线全1
if (j == i) { arr[i][j] = 1; break; }
if (j == 0) { arr[i][j] = 1; continue; }//
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];//头上和斜上之和为当前元素值
}
}
for (int i = 0; i < a; i++) {
for(int j=0;j<=i;j++){
printf("%d,", arr[i][j]);
}
printf("\n");
}
}
int main() {
int numRows=6;
Yanghui(numRows);
return 0;
}