今天给大家带来几道面试题!
我们可以先自己自行思考,下面是参考答案:
方法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
void reverse_part(char* str, int start, int end) //将字符串从start到end这一段逆序
{
int i, j;
char tmp;
for (i = start, j = end; i < j; i++, j--)
{
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void leftRound(char* src, int n)
{
int len = strlen(src);
reverse_part(src, 0, n ); //逆序前段
reverse_part(src, n+1, len - 1); //逆序后段
reverse_part(src, 0, len - 1); //整体逆序
}
int main()
{
char str[] = "abcdfghijk";
int n = 0;
printf("左旋几位?\n");
scanf("%d", &n);
printf("原来字符串\n");
printf("%s", str);
leftRound(str, n-1);
printf("\n左旋%d位后的字符串\n",n);
printf("%s", str);
return 0;
}
具体思路:
我们先创建一个倒序字符串的函数,具体是要将字符串分别进行倒叙后,才能得到左旋字符串。
即:先将左旋前部分倒叙,再将后半部分进行倒叙,最后将整个字符串进行倒叙。即可得到左旋n
位的字符串。
方法二:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#includevoid leftRound(char* src, int n)
{
int len = strlen(src);
char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
strcpy(tmp, src + n); //先将后面的全部拷过来
strncat(tmp, src, n); //然后将前面几个接上
strcpy(src, tmp); //最后拷回去
}
int main()
{
char str[] = "abcdfghijk";
int n = 0;
printf("左旋几位?\n");
scanf("%d", &n);
printf("原来字符串\n");
printf("%s", str);
leftRound(str, n);
printf("\n左旋%d位后的字符串\n",n);
printf("%s", str);
return 0;
}
具体思路:
这个方法则是运用了字符串函数进行左旋,首先先将n位后的元素拷贝到tem中,然后再将n位元素也拷贝到tem中,此时tem中已经是完成左旋的字符串,最后将tem再拷贝到初始数组中即可。这个需要形成一个辅组空间进行储存,好让字符串可以拷贝和连接。
缺点:需要创建一个辅助空间,来协助代码的完成。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
void swap_arr(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
int tmp = 0;
while (left < right)
{
// 从前往后,找到一个偶数,找到后停止
while ((left < right) && (arr[left] % 2 == 1))
{
left++;
}
// 从后往前找,找一个奇数,找到后停止
while ((left < right) && (arr[right] % 2 == 0))
{
right--;
}
// 如果偶数和奇数都找到,交换这两个数据的位置
// 然后继续找,直到两个指针相遇
if (left < right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[] = { 37,57,2,4,40,32,44,33,55,68 };
int sz = sizeof(arr) / sizeof(arr[3]);
printf("原数组排序\n");
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
swap_arr(arr, sz);
printf("排序完后的数组\n");
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
具体思路:
1. 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置
2. 循环进行一下操作
a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环
b. left从前往后找,找到一个偶数后停止
c. right从后往前找,找到一个奇数后停止
d. 如果left和right都找到了对应的数据,则交换,继续往下找。
大家观察下方代码,觉得打印的是什么呢?
#include
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
好了公布答案: >.
首先我们要知道C语言中,0为假,非0即为真。
全局变量,没有给初始值时,编译其会默认将其初始化为0。
i的初始值为0,i 结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该是 <,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该为 >.
好了今天的文章到这!