1、调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
- 思路简析:
判断第一个数是不是奇数,若果是奇数,那就不移动,然后看下一个数,如果是偶数,那就把这个数放在最后一个位置。如果有发现一个偶数,就放在倒数第二个位置,以此类推。当后面向前移动的位置和要比较的那个数重合了。会停止循环。
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void ahead_oaa(int arr[], int length) {
int temp = 0;
int num = 0;
int len = length - 1;//确定最后一个位置
while (temp != len) {//需要判断的数字和更新的位置比较
if (arr[temp] % 2 == 0) {//偶数
num = arr[len];
arr[len] = arr[temp];
arr[temp] = num;//把偶数和最后一个数进行交换。
--len;//最后一个位置的数就不管了。把要交换的位置更新到前一个
}
else {
++temp;//是奇数就不动,判断下一个数字。后面的位置不更新
continue;
}
}
}
void main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
int len = sizeof(arr) / sizeof(arr[0]);
int show = 0;
ahead_oaa(arr, len);
while (show<len) {
printf("%d ",arr[show]);
++show;
}
system("pause");
}
2、杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
//1 2 3 //1 3 4 //1 2 3
//2 3 4 //2 4 5 //4 5 6
//3 4 5 //4 5 6 //7 8 9
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//杨氏矩阵
//有一个二维数组.
//数组的每行从左到右是递增的,每列从上到下是递增的.
//在这样的数组中查找一个数字是否存在。
//时间复杂度小于O(N);
数组:
//1 2 3 //1 3 4 //1 2 3
//2 3 4 //2 4 5 //4 5 6
//3 4 5 //4 5 6 //7 8 9
//思路:
//因为是一行和一列都是递增的,所以可以从最后一个数进行比较
//然后从最后一个数到第一个数进行遍历的比较
void to_find(int arr[3][3],int num,int row,int col) {//二位数组的行和列
if (num > arr[2][2]) {
printf("这个数太大了!没找到!\n");
}
else if (num < arr[0][0]) {
printf("这个数太小了!没找到!\n");
}
else
while ((row>=0)&&(col>=0)) {//直到找到或者遍历完没找到退出循环
if (num==arr[row][col]) {
printf("找到了!第一次出现在第%d行,第%d列\n",row,col);
break;
}
else if (num<arr[row][col]) {
--col;//往后开始更新
}
else if (col == 0) {
--row;//因为这是最后一行,所以到上一行arr[1][0],此时col==0
col += 2;//到第一个了就要,到上一行的第3个数字arr[1][2]
}
}
}
void main() {
int arr[3][3] = { {1,2,3},{2,3,4}, {3,4,5} };
int num;
printf("请输入一个整数:");
scanf("%d",&num);
to_find(arr,num,2,2);
system("pause");
}
3、实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//实现一个函数,可以左旋字符串中的k个字符。
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB
//思路//
//输入k次
//第一个循环的第一次循环时候,第一个字符存储起来,然后第一个字符的位置存第二个字符,一次类推,最后一个位置会空出来
//
//然后吧第一个字符复制到最后一个位置上
//然后循环K次
void to_reversek(char* arr, int length, int k) {
while (k) {
char j = arr[0];//存储第一个元素
char* start = arr;
for (int temp = 0; temp < length-1; ++temp) {
*start = *(start + 1);
++start;
}
*start = j;
--k;
}
printf("%s", arr);
}
void main() {
char arr[] = "COMPUTER!";
int k = 0;
int length = strlen(arr);
printf("原字符串为%s,长度为%d\n", arr, length);
while (1) {
printf("请输入要翻转字符的个数:");
scanf("%d", &k);
if (k < 0 || k>9) {
printf("您输入有误,请重新输入!");
continue;
}
else {
to_reversek(arr, length, k);
break;
}
}
system("pause");
}
4、判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//判断一个字符串是否为另外一个字符串旋转之后的字符串。
//例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1 = abcd和s2 = ACBD,返回0.
//
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//
//AABCD右旋一个字符得到DAABC
int judge_rotating(char* str1, char* str2) {
int i = 0;
int j = 0;
int lenght = strlen(str1);
while (lenght) {
char j = str1[0];//存储第一个元素
char* start = str1;
for (int temp = 0; temp < lenght - 1; ++temp) {
*start = *(start + 1);
++start;
}
*start = j;
--lenght;
if (0 == strcmp(str1, str2))//用上次判断旋转的思路,然后比较两个字符串是否相同就行了。
{
return 1;
}
}
return 0;
}
void main() {
char s1[] = "CABED";
char s2[] = "ABEDC";
printf("%d\n",judge_rotating(s1,s2));//判断旋转
system("pause");
}