实验七 指针程序设计 编一个函数void rearrange(int *p, int m, int n) 给定一个非严格递增排列的数组nums,请删除重复出现的元素,使每个元素只出现一次

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;
}

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值