华为机试题

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <assert.h>
#include <string>
using namespace std;
char substr[20];
int maxcount=0;
//一个字符串是否为另一个字符串的子串
char* Mystrstr( char* str, char* substr) {
	 assert(str!=NULL);
	 assert(substr!=NULL);
	for(int i=0;str[i]!='\0';i++) {
		int j=0;
		if(str[i]==substr[j]) {
			while(substr[j]!='\0' && str[i]==substr[j]){
				   i++;
				   j++;
			}
		}
		if(substr[j]=='\0') return &str[i-j];
	}
	return NULL;
}

//字符串复制问题
char * Mystrcpy( char *strDest, const char *strSrc ) 
  {    
	assert( (strDest != NULL) && (strSrc != NULL) );    
	char *address = strDest;      
	while( (*strDest++ = *strSrc++) != '\0' );      
	return address;  
}

//从大到小取子串问题
void subString(char *str){
	int len = strlen(str);
	char *tmp = (char*)malloc(len);
	for(int i=len;i>0;i--) {
		for(int j=0;j+i<=len;j++){
			strncpy(tmp,str+j,i);      
			tmp[i]='\0';      //一定要写
			cout<<tmp<<endl;
		}
	}
}

//字符串中连续出现次数最多的子串
void MostContSustr(char *str) {
	int len = strlen(str);
	int maxcount = 1;
	for(int i=0;i<len;i++) 
	{
		for(int j=i+1;j<len;j++) 
		{
			int n = j-i,cnt=1;
			if(strncmp(str+i,str+j,n)==0)
			{
				cnt++;
				for(int k=j+n;k<len;k+=n)
				{
				if(strncmp(str+i,str+k,n)==0)
					{
						cnt++;
					}else break;
				}
				if(cnt>maxcount) {
					maxcount = cnt;
					strncpy(substr,str+i,n);
					substr[n] = '\0';
				}
			}
		}
	}
}

//从指定字符串中去掉规定的字符
char* remove(char *s ,char ch) {
	int len = strlen(s);
	char *tmp = (char*)malloc(len);
	int j=0;
	for(int i=0;s[i]!='\0';i++) {
		if(s[i]!=ch) {
			tmp[j++] = s[i];
		}
	}
	tmp[j] = '\0';
	return tmp;
}

//出现相同且长度最长的子串
int  longSubString() {
	char *s = (char*)malloc(100);
	gets(s);
	int len=strlen(s);
	char *sub = (char*)malloc(100);
	//char sub[100] = {'\0'};
	for(int i=len;i>0;i--) 
	{   
		for(int j=0;j+i<=len;j++) 
		{
			strncpy(sub,s+j,i);
			sub[i]='\0';
			if(strstr(s+j+1,sub)!=NULL) {   //strstr 这个函数有什么意思的呢   substr这个函数又是什么意思呢 
				cout<<"出现相同且最长的字串为:"<<sub<<endl;
				cout<<"首字符的位置是:"<<j+1<<endl;
				return 1;
			}
		}
	}
	return 0;
}
//单词倒置
void WordsReverse() {
	 char str[100];
	 gets(str);
	 int len = strlen(str);
	 int i,j;
	 for(i=0,j=len-1;i<j;i++,j--) {
		char tmp = str[i];
		str[i] = str[j];
		str[j] = tmp;
	 }
	 printf("%s\n",str);
	 i = 0;
	 while(str[i]) {
		 int begin=0,end=0;
		 if(str[i]!=' ') {
			begin = i;
			while(str[i]&&str[i]!=' ') { i++;}
			i = i-1;
			end = i;
		 }
		 while(begin<end) {
			char tmp = str[begin];
			str[begin] = str[end];
			str[end] = tmp;
			begin++;
			end--;
		 }
		 i++;
	 }
		 printf("%s",str);
}
//转换字符串格式为字符串里的字符+该字符连续出现的个数
char *ReverseStrForm(char* str) {
	int count=1,k=0;
	char *reschar = (char*)malloc(20);
	int len = strlen(str);
	for(int i=0;i<len;i++) {
		if(str[i+1] == str[i]) {
			count++;
		}else {
			reschar[k++]=str[i];
			char c = count+'0';  //加'0'是将之转换为字符串的呢
			reschar[k++] = c;
			count=1;
		}
	}
	reschar[k] = '\0';
	return &reschar[0];
	
}

/*
int main() {
	char *s1 = "hello world";
	char *s2 = "world";
    char *s = Mystrstr(s1,s2);
	char str[10]={'\0'};
	char *ss = (char*)malloc(80);
//	strncpy(ss,s1,4);
//	cout<<ss<<endl;
//	gets(str);
//	puts(str);
//	subString("abcde");
//	MostContSustr("abcdededefgh");
//	char *p = remove(s1,'o');
//	cout<<p<<endl;
//	longSubString();
//	WordsReverse();
	s2 = ReverseStrForm("aaddeefffsse");
	cout<<s2;
	return 0;
}
*/
//#include "stdafx.h"
#include <stdio.h>
#include <iostream>

void Swap(int &x,int &y) {
	int temp = x;
	x = y;
	y = temp;
}

//选择排序
void SelectSort(int A[],int n) {
	for(int i=0;i<n-1;i++) {
		for(int j=i+1;j<n;j++) {
			if(A[i]<A[j]) Swap(A[i],A[j]);
		}
	}
}

//将一个无序的数组进行从大到小排序  对应的下标也排序
void SortWithIndex(int array[],int n,int index[]) {
	for(int i=0;i<n-1;i++) {
		for(int j=i+1;j<n;j++) {
			if(array[i]>array[j]) {
				int tmp = array[i];
				array[i] = array[j];
				array[j] = tmp;
				int tmp2 = index[i];
				index[i] = index[j];
				index[j] = tmp2;
			}
		}
	}
}

//插入排序
void InsertSort(int A[],int n) {
	for(int i=1;i<n;i++) {
		int tmp = A[i];
		int j = i;
		while(j>0 && tmp<A[j-1]) {
			A[j] = A[j-1];
			j--;
		}
	A[j] = tmp;
	}
}

//插入排序2
void InsertSort2(int A[],int n) {
	for(int i=1;i<n;i++) {
		int tmp = A[i];
		int j = i-1;
		while(j>=0 && tmp<A[j]) {
			A[j+1] = A[j];
			j--;
		}
	A[j+1] = tmp;
	}
}

//冒泡排序 
void BubbleSort(int A[],int n) {
	for(int i=n-1;i>0;i--) {
		for(int j=0;j<i;j++) {
			if(A[j]>A[j+1])
				Swap(A[j],A[j+1]);
		}
	}
}
//冒泡排序2
void BubbleSort2(int A[],int n) {
	for(int i=0;i<n-1;i++) {
		for(int j=0;j<n-i;j++) {
			if(A[j]>A[j+1])
				Swap(A[j],A[j+1]);
		}
	}
}
//快速排序 
void QuickSort(int A[],int left,int right) {
	int i,j;
	if(left<right) {
		i = left,j = right+1;
		do{
			do {i++;}while(A[i]<A[left]);
			do {j--;}while(A[j]>A[left]);
		if(i<j) Swap(A[i],A[j]);
		}while(i<j);
		Swap(A[left],A[j]);
		QuickSort(A,left,j-1);
		QuickSort(A,j+1,right);
	}
}
//希尔排序
void ShellSort(int A[], int n) {
	int h = 1;
	while(h<=n/3) h = 3*h+1;
	while(h>0) {
		for(int i=h;i<n;i++) {
			int j = i,tmp = A[i];
			while(j>h-1 && A[j-h]>tmp) {
				A[j] = A[j-h];
				j-=h;
			}
			A[j] = tmp;
		}
		h = (h-1)/3;
	}
}

void Merging(int A[],int Temp[],int i1,int j1,int i2,int j2,int &k) {
	int i=i1,j=i2;
	while(i<j1 && j<j2) {
		if(A[i]<A[j]) Temp[k++] = A[i++];
		else Temp[k++] = A[j++];
	}
	while(i<=j1) Temp[k++] = A[i++];
	while(j<=j2) Temp[k++] = A[j++];
}
//二路合并排序
void MergeSort2(int A[],int n) {
	int *Temp = (int *)malloc(n);
	int i1,j1,i2,j2,k,size=1;
	while(size<n) {
		i1=0;k=0;
		while(i1+size<n) {
			i2=i1+size;j1=i2-1;
			if(i2+size-1>n-1) j2=n-1;
			else j2=i2+size-1;
			Merging(A,Temp,i1,j1,i2,j2,k);
			i1 = j2+1;
		}
		for(int i=0;i<k;i++) A[i]=Temp[i];
		size*=2;
	}
}

/*
int main() {
	int arr[10] = {2,4,1,6,9,7,2,6,0,5};
	SelectSort(arr,10);
	int i;

	printf("选择排序");
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}
	/*
	printf("\n插入排序");
	InsertSort(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}
	printf("\n插入排序2");
	InsertSort2(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}

	printf("\n冒泡排序");
	BubbleSort(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}

	printf("\n冒泡排序2");
	BubbleSort2(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}

	/*
	printf("\n快速排序");
	QuickSort(arr,0,9);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}
	printf("\n希尔排序");
	ShellSort(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}
	printf("\n二路合并排序");
	MergeSort2(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}
	

	
	printf("\n测试一下下啊");
	test(arr,10);
	for( i=0;i<10;i++) {
	printf("  %d",arr[i]);
	}
	*/
	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值