重庆璧山网站制作公司哪家专业,商城网站建设 优帮云,seo对各类网站的作用,建设seo网站今天给大家带来几道面试题#xff01;
实现一个函数#xff0c;可以左旋字符串中的k个字符。 例如#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB
我们可以先自己自行思考#xff0c;下面是参考答案#xff1a;
方法一#xff1a;
#define _CRT_SEC…今天给大家带来几道面试题
实现一个函数可以左旋字符串中的k个字符。 例如 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB
我们可以先自己自行思考下面是参考答案
方法一
#define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h
#includestring.h
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, n1, 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
#includestdio.h
#includestring.hvoid leftRound(char* src, int n)
{int len strlen(src);char tmp[256] { 0 }; //更准确的话可以选择malloc len 1个字节的空间来做这个tmpstrcpy(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
#includestdio.h
#includestring.hvoid 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和rightleft放在数组的起始位置right放在数组中最后一个元素的位置 2. 循环进行一下操作 a. 如果left和right表示的区间[left, right]有效进行b否则结束循环 b. left从前往后找找到一个偶数后停止 c. right从后往前找找到一个奇数后停止 d. 如果left和right都找到了对应的数据则交换继续往下找。 思维题
大家观察下方代码觉得打印的是什么呢
#include stdio.h
int i;
int main()
{i--;if (i sizeof(i)){printf(\n);}else{printf(\n);}return 0;
}
好了公布答案 .
首先我们要知道C语言中0为假非0即为真。
全局变量没有给初始值时编译其会默认将其初始化为0。
i的初始值为0i 结果-1i为整形sizeof(i)求i类型大小是4按照此分析来看结果应该是 但是sizeof的返回值类型实际为无符号整形因此编译器会自动将左侧i自动转换为无符号整形的数据-1对应的无符号整形是一个非常大的数字超过4或者8故实际应该为 . 好了今天的文章到这