0
点赞
收藏
分享

微信扫一扫

编程题(3):

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
#include<assert.h>

//作业(1):实现一个函数,可以左旋字符串中的k个字符 (这种称为旋转字符串)
//例如:ABCD左旋一个字符得到BCDA
// ABCD左旋两个字符得到CDAB

//方法(1):暴力求解法:
//void left_move(char* arr,int k)
//{
// assert(arr != NULL);
// char temp;
// int len = strlen(arr);
// assert(k <= len);
// int i;
// for (i = 0; i < k; i++)
// {
// //第一步:将第一个字符存在空指针
// temp = *arr;
// int j;
// //第二步:将后面的字符依次往前存储
// for (j = 0; j < len - 1; j++)
// {
// *(arr+j) = *(arr+j + 1);
// }
// //第三步:将空指针的字符存入字符串最后
// *(arr+len - 1) = temp;
// }
//}
//int main()
//{
// char arr[] = "abcdef";
// left_move(arr,3);
// printf("%s\n", arr);
// return 0;
//}

//方法(2):三步翻转法:1、abcdef 2、ba fedc(左旋几个字符,就用几个字符作为分隔) 3、cdefab
//void reverse(char* left, char* right)
//{
// assert(left != NULL);
// assert(right!= NULL);
// char temp;
// while (left < right)
// {
// temp = *left;
// *left = *right;
// *right = temp;
// left++;
// right--;
// }
//}
//void left_move(char* arr,int k)
//{
// assert(arr != NULL);
// int len = strlen(arr);
// assert(k <= len);
// reverse(arr, arr + k - 1); //逆序左边
// reverse(arr + k, arr + len - 1); //逆序右边
// reverse(arr, arr + len - 1); //逆序整体
//}
//int main()
//{
// char arr[] = "abcdef";
// left_move(arr,4);
// printf("%s\n", arr);
// return 0;
//}


//作业(2):写一个函数,判断一个字符串是否为另一个字符串旋转之后的字符串
//例:s1=abcdef ,s1=bcdefa,返回1 ,如不是,则返回0
//方法(1):遍历查询,旋转,是否有相等的
//void reverse(char* left, char* right)
//{
// assert(left != NULL);
// assert(right!= NULL);
// char temp;
// while (left < right)
// {
// temp = *left;
// *left = *right;
// *right = temp;
// left++;
// right--;
// }
//}
//void move(char* arr,int k)
//{
// assert(arr != NULL);
// int len = strlen(arr);
// assert(k <= len);
// reverse(arr, arr + k - 1); //逆序左边
// reverse(arr + k, arr + len - 1); //逆序右边
// reverse(arr, arr + len - 1); //逆序整体
//}
//int is_move(char *s1,char*s2)
//{
// int len = strlen(s1);
// int i;
// for (i = 0; i < len; i++)
// {
// move(s1,1);
// int temp=strcmp(s1, s2);
// if (temp == 0)
// return 1;
// }
// return 0;
//}
//int main()
//{
// char arr1[] = "abcdef";
// char arr2[] = "defabc";
// int ret = is_move(arr1,arr2);
// if (ret == 1)
// printf("Yes\n");
// else
// printf("NO\n");
// return 0;
//}

//方法(2):abcdefabcdef ,追加之后,查询是否有相等的
//int is_move(char* s1, char* s2)
//{
// int len1 = strlen(s1);
// int len2 = strlen(s2);
// if (len1 != len2)
// return 0;
//
// //1.在s1字符串中追加一个s1字符串
// strncat(s1, s1, len1); //自己给自己追加,不能使用strcat
// //2.判断s2 是否为s1的子串
// char* p=strstr(s1, s2);
// if (p != NULL)
// return 1;
// else
// return 0;
//}
//int main()
//{
// char arr1[15] = "abcdef";
// char arr2[] = "fabcde";
// int ret = is_move(arr1, arr2);
// if (ret == 1)
// printf("Yes\n");
// else
// printf("No\n");
// return 0;
//}

//作业(3):杨氏矩阵:
//一个数字矩阵,每行从左到右是递增的,从上到下是递增的,请在矩阵中查找某个数字是否存在:
//要求:时间复杂度小于O(N)
int FindNum(int arr[3][3], int k, int* px, int* py)
{
int x = 0;
int y = *py - 1;
while (x <= *px - 1 && y >= 0)
{
if (arr[x][y] < k)
x++;
else if (arr[x][y] > k)
y--;
else
{
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int i,j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
int x = 3;
int y = 3;
int num;
printf("请输入要查找的数字:>"); scanf("%d", &num);
int ret=FindNum(arr, num, &x, &y);
if (ret == 1)
printf("找到了\n是arr[%d][%d]\n",x,y);
else
printf("找不到\n");
return 0;
}

举报

相关推荐

0 条评论