1.调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
2.有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
1 2 3
2 3 4
3 4 5
3.一个字符串中查找第一个只出现一次的字符。
要求复杂度为O(N).
例如:
题目:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void jump_arr(int arr[],int sz)//仿照冒泡排序的实现方法,效率太低
{
int i = 0;
int j = 0;
for(i=0; i<sz-1; i++)
{
if(arr[i]%2==1)
continue;
for(j=0; j<sz-1-i; j++)
{
if((arr[j]%2==0) && (arr[j+1]%2==1))
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int i = 0;
int arr[]={1,2,3,4,5,6,7,8,9,0};
int sz = sizeof(arr)/sizeof(arr[0]);
jump_arr(arr,sz);
for(i=0; i<sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void jump_arr(int arr1[],int arr2[],int sz)//数组大小固定,不灵活
{
int i = 0;
for(i=0; i<sz; i++)
{
if(arr1[i]%2==1)
{
*arr2++=arr1[i];
}
}
for(i=0; i<sz; i++)
{
if(arr1[i]%2==0)
{
*arr2++=arr1[i];
}
}
}
int main()
{
int i = 0;
int arr1[10]={1,2,3,4,5,6,7,8,9,0};
int arr2[10]={0};
int sz = sizeof(arr1)/sizeof(arr1[0]);
jump_arr(arr1,arr2,sz);
for(i=0; i<sz; i++)
{
printf("%d ",arr2[i]);
}
printf("\n");
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void jump_arr(int arr[],int sz)//仿照翻转字符串实现
{
int left = 0;
int right = sz-1;
while(left<=right)
{
if((arr[left]%2==0) && (arr[right])%2==1)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
left++;
right--;
}
}
int main()
{
int i = 0;
int arr[]={1,2,3,4,5,6,7,8,9,0};
int sz = sizeof(arr)/sizeof(arr[0]);
jump_arr(arr,sz);
for(i=0; i<sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
system("pause");
return 0;
}
2.有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
1 2 3
2 3 4
3 4 5
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
char find_num(int arr[][4],int ROW,int LINE,int n)
{
int row = 0;
int line = LINE-1;
while(row<ROW,line>=0)
{
if(arr[row][line]==n)
return 'y';
else if(arr[row][line]<n)
row++;
else
line--;
}
return 'n';
}
int main()
{
int arr[4][4]={{1,2,3,4},{5,6,7,8},{6,7,8,9},{10,11,12,13}};
int num = 1;
char ret = find_num(arr,4,4,num);
if(ret=='y')
{
printf("在\n");
}
else
{
printf("不在\n");
}
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
char find_num(int arr[][4],int ROW,int LINE,int n)
{
int row = ROW-1;
int line = 0;
while(row>=0,line<LINE)
{
if(arr[row][line]==n)
return 'y';
else if(arr[row][line]<n)
line++;
else
row--;
}
return 'n';
}
int main()
{
int arr[4][4]={{1,2,3,4},{5,6,7,8},{6,7,8,9},{10,11,12,13}};
int num = 1;
char ret = find_num(arr,4,4,num);
if(ret=='y')
{
printf("在\n");
}
else
{
printf("不在\n");
}
system("pause");
return 0;
}
3.一个字符串中查找第一个只出现一次的字符。
要求复杂度为O(N).
例如:
字符串:"aaaabfqccrbdw",返回f.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char find_first_single(const char *str)
{
unsigned int arr[256]={0};
const char *tmp=str;
assert(str);
while(*tmp)
{
arr[*tmp]++;
tmp++;
}
tmp=str;
while(*tmp)
{
if(arr[*tmp]==1)
return *tmp;
*tmp++;
}
return '\0';
}
int main()
{
char *pa="aaaabfgccbdw";
char ret = find_first_single(pa);
if(ret!='\0')
printf("第一次单独出现的字符是:%c\n",ret);
system("pause");
return 0;
}