1. 编一个函数void rearrange(int *p, int m, int n),能够将p所指数组中下标m到下标n的数组元素实现首尾颠倒。在主函数中有一个数组int a[10]= {1,2,3,4,5,6,7,8,9,10};若调用函数时传给m和n的值分别是4和7,则函数调用后在主函数中数组输出为:1,2,3,4,8,7,6,5,9,10。
#include <stdio.h>
void rearrange(int *p, int m, int n){
int i;
if(m<0 || m>n){
printf("Error!\n");
return;
}
for(i=0;i<=(n-m)/2;i++){
int temp;
temp = *(p+m+i);
*(p+m+i) = *(p+n-i);
*(p+n-i) = temp;
// printf("第%d个与%d个交换了!\n",m+i,n-i);
}
}
int main(){
int i;
int a[10]= {1,2,3,4,5,6,7,8,9,10};
// 传 4 和 7
rearrange(a,4,7);
for(i=0;i<10;i++){
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
2. 给定一个非严格递增排列的数组nums,请删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序保持一致,返回 nums中唯一元素的个数。要求用数组作为函数参数实现。请考虑本题中时间和空间复杂度问题,使其尽可能小。
输入输出示例:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
#include <stdio.h>
/*
* 删除递增数组相同元素
*/
int delSameEle(int *nums,int len){
// 如果长度为 0
if(len==0){
return 0;
}
int i,j,newLen=1;
for(i=0;i<len-1;i++){
if(nums[i]!=nums[i+1]){
nums[newLen] = nums[i+1];
newLen++;
}
}
// 返回新数组长度
return newLen;
}
int main(){
int i;
int nums[10] = {0,0,1,1,1,2,2,3,3,4};
int newLen = delSameEle(nums,10);
printf("%d,nums=[",newLen);
for(i=0;i<newLen;i++){
if(i!=newLen-1){
printf("%d,",nums[i]);
}else {
printf("%d",nums[i]);
}
}
printf("]\n");
return 0;
}
3. 编写一个函数int index(char *str,char ch),能返回在字符串str中第一次出现字符ch的位置,若找不到则返回-1。在主函数中输入字符串“information”,然后分别输出字符 ‘i’、‘f’、‘x’的位置(应分别输出1、3、-1)。
#include <stdio.h>
int index(char *str,char ch){
int i=0;
for(i=0;*(str+i)!='\0';i++){
if(*(str+i)==ch){
return i+1;
}
}
return -1;
}
int main(){
char arr[]="information";
printf("%d\n",index(arr,'i'));
printf("%d\n",index(arr,'f'));
printf("%d\n",index(arr,'x'));
return 0;
}
4. 无重复字符的最长子串。要求用函数实现。
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
输入输出示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入输出示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入输出示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
#include <stdio.h>
#include <string.h>
int max(int a,int b){
return a>b?a:b;
}
int maxSubString(char *s){
int len = strlen(s);
int i,j,m=1,ch=s[0],p=0;
for(i=1;i<len;i++){
for(j=p;j<i;j++){
if(s[j]==s[i]){
m=max(m,i-p);
p=j+1;
}
}
}
m = max(m,len-p);
return m;
}
int main(){
char arr[100]="0";
scanf("%s",arr);
// puts(arr);
printf("%d\n",maxSubString(arr));
return 0;
}