【C语言】——小程序(调整奇偶数顺序、字符串逆序、求一个字符串左旋n次的字符串)

1.调整奇偶数顺序
输入一个整数数组,实现一个函数,调整数组使奇数全部都位于偶数前面

具体代码实现如下:


//调整奇偶数顺序
//输入一个整数数组,实现一个函数,调整数组使奇数全部都位于偶数前面
void move_arr(int arr[], int sz){
	int left = 0;
	int right = sz - 1;

	while (left < right){
		//从左边找一个偶数
		while ((left < right) && (arr[left] % 2 == 1)){
			left++;
		}
		//从右边找一个奇数
		while ((left < right) && (arr[right] % 2 == 0)){
			right--;
		}
		if (left < right){
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = arr[left];
		}
	}
}
void print_arr(int arr[],int sz){
	int i = 0;
	for (i = 0; i < sz - 1;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");
}
	int main(){
		int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		int sz = sizeof(arr) / sizeof(arr[0]);

		print_arr(arr, sz);
		move_arr(arr, sz);
		print_arr(arr, sz);
		return 0;
	}

2.字符串逆序
写一个函数,可以逆序一个字符串的内容。

具体代码实现如下:

//字符串逆序
//写一个函数,可以逆序一个字符串的内容。
void reverseStr(char* str){
	int len = strlen(str);	//求出字符串的长度
	char *left = str;		  //左边字符指针
	char *right = str + len - 1;	 //右边字符指针 = 数组首元素地址 + 字符串长度 - 1

	while (left < right){
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
		
	}

}
int main(){
	char arr[100] = {0};
	printf("请输入字符串:");
	//scanf("%s",arr);	scanf()函数:遇到空格就不在往后读取内容了
	gets(arr);	   //gets()函数:读取一行,有空格也读取内容
	reverseStr(arr);
	printf("逆序后的字符串为:%s\n", arr);
	return 0;
}

3.求一个字符串左旋n次的字符串

具体代码实现如下:

//求一个字符串左旋n次的字符串

//RotateLK2算法的时间复杂度为O(n),空间复杂度为O(1)
//逆置函数
void reverseStr(char *start, char *end){
	while (start < end){
		char tmp = *start;
		*start = *end;
		*end = tmp;

		++start;
		--end;
	}
}
AB CDEF
BA FEDC	 从旋转位置开始分开,分两段逆置
CDEFAB	  在整体逆置

void RotateLK2(char *str,int k){
	int len = strlen(str);
	k %= len;
	reverseStr(str, str + k - 1);
	reverseStr(str + k ,str + len -1);
	reverseStr(str,str + len - 1);
}

/**
// RotateLk1算法的时间复杂度为O(n * n)
void RotateLK1(char *str,int k){
	int len = strlen(str);
	k %= len;
	int i = 0;
	while (k--){
		//左旋一次
		char tmp = str[0];
		for (i = 0; i < len - 1 ; i++){
			str[i] = str[i + 1];
		}
		str[len - 1] = tmp;
	}
*/
	
}
int main(){
	char arr[] = "abcd";
	//RotateLK1(arr, 2);
	RotateLK2(arr, 2);
	printf("%s\n",arr);
	return 0;
}

4.字符串旋转操作:

                     给定s1 =AABCD和s2 = BCDAA,返回1
                     给定s1=abcd和s2=ACBD,返回0.
                     AABCD左旋一个字符得到ABCDA
                     AABCD左旋两个字符得到BCDAA
                     AABCD右旋一个字符得到DAABC


解题思路1:将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,

解题思路2:其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
                    所以可考虑,只需要将原字符串再来一遍接在后面,
                    然后找一找待查找的字符串是不是两倍原字符串的子集即可。

//字符串旋转结果
/*
解题思路1:将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,

解题思路2:其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,
然后找一找待查找的字符串是不是两倍原字符串的子集即可。
int findRound(const char * src, char * find)
{
char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串
strcpy(tmp, src); //先拷贝一遍
strcat(tmp, src); //再连接一遍
return strstr(tmp, find) != NULL; //看看找不找得到
}
*/

//如果是旋转字符串  返回1  , 不是 则返回0
//int Isrotatingstr(char arr[], char str[]) {
//	char arr1[1024] = { 0 };
//	strcpy(arr1, arr);          //字符串复函数 , 把后面的字符串(arr)  赋值给  前面的字符数组(arr1)
//	strcat(arr1, arr);          //字符串连接函数 , 吧arr 连接在arr1的后面  
//	int ret = strstr(arr1, str);//判断arr 是不是 arr1 的子串  如果没有返回NULL
//	if (ret == NULL) {
//		return 0;
//	}
//	return 1;
//}
int findRotateStr(char arr[],char find[]){
	char tmp[1024] = { 0 };//辅助空间存放两倍的原字符串 ;
	strcpy(tmp, arr);
	strcat(tmp,arr);
	int ret = strstr(tmp,find);
	if (ret == NULL){
		return 0;
	}
	return 1;
}
int main(){
	char arr[] = "ABCDEF";
	char find[] = "BCDEFA";//待判断的字符串
	int ret = findRotateStr(arr,find);
	if (ret == 1){
		printf("str是arr的旋转字符串!\n");
	}

	else if (ret == 0){
		printf("str不是arr的旋转字符串!\n");
	}

	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值