1、杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#define ROW 3
#define COL 3
//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
//要求:时间复杂度小于O(N);
int SearchNum(int p[ROW][COL], int key)
{
int i = 0;
int j = 0;
while (i < ROW)
{
if (key > p[i][COL-1])
{
i++;
}
else
{
while (j < COL)
{
if (p[i][j] == key)
{
return j + i*ROW;
}
j++;
}
}
}
return 0;
}
int main()
{
int key = 0;
int arr[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("请输入要找的数:");
scanf_s("%d", &key);
int a = SearchNum(arr, key);
printf("行:%d\n列:%d\n", (a / ROW) + 1, (a%COL) + 1);
}
2、字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
//实现一个函数,可以左旋字符串中的k个字符。
//例如:
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
char* LeftRotation(char* str,int k)
{
int len = strlen(str);
char* run = str;
while (k)
{
char tmp = *str;
for (int i = 1; i < len; i++)
{
*run = *(run + 1);
run++;
}
*run = tmp;
run = str;
k--;
}
return str;
}
int main()
{
char str[] = "hello";
char* a = LeftRotation(str, 2);
printf("%s", a);
return 0;
}
3、字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
//写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
//例如:给定s1 = AABCD和s2 = BCDAA,返回1
//给定s1 = abcd和s2 = ACBD,返回0.
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//AABCD右旋一个字符得到DAABC
char* LeftRotation(char* str,int k)
{
int len = strlen(str);
assert(len >= k);
char* run = str;
while (k)
{
char tmp = *str;
for (int i = 1; i < len; i++)
{
*run = *(run + 1);
run++;
}
*run = tmp;
run = str;
k--;
}
return str;
}
char* RightRotation(char* str, int k)
{
int len = strlen(str);
assert(len >= k);
char* run = str + len - 1;
while (k)
{
char tmp = *(str + len - 1);
for (int i = 1; i < len; i++)
{
*run = *(run - 1);
run--;
}
*run = tmp;
run = str + len - 1;
k--;
}
return str;
}
int JudgingRotation(char*str1, char*str2)
{
int len1 = strlen(str1);
char* str = 0;
//左旋转判断
for (int k = 1; k < len1; k++)
{
str = LeftRotation(str1, k);
if (*str == *str2)
{
return 1;
}
str = RightRotation(str1, k);
}
//右旋转判断
for (int k = 1; k < len1; k++)
{
str = RightRotation(str1, k);
if (*str == *str2)
{
return 1;
}
str = LeftRotation(str1, k);
}
return 0;
}
int main()
{
char str1[] = "mingtiannihao";
char str2[] = "haomingtianni";
int a = JudgingRotation(str1, str2);
printf("%d\n", a);
return 0;
}