两个有序数组求并集:
1. NSArray*array1 =@[@"1",@"2",@"3"];
NSArray*array2 =@[@"1",@"5",@"6"];
NSMutableSet *set1 = [NSMutableSet setWithArray:array1];
NSMutableSet *set2 = [NSMutableSet setWithArray:array2];
[set1 intersectSet:set2];
2. 使用两个指针分别指向数组A和数组B,指向数据小的指针往前继续移动,保存两个指针指向相同数据的值,直到两个指针都指向数组末尾,该算法的时间复杂度为O(m+n)。
void GetIntersectionSet(int ABuffer[],int ALength,int BBuffer[],int BLength,int*des)
{
intpointerA =0;
intpointerB =0;
inttemp =0;
while(pointerA < ALength && pointerB < BLength)
{
if(ABuffer[pointerA] < BBuffer[pointerB])
{
pointerA++;
}
else if(BBuffer[pointerB] < ABuffer[pointerA])
{
pointerB++;
}
else
{
des[temp] = ABuffer[pointerA];
temp++;
pointerA++;
pointerB++;
}
}
}
3.使用二分法,由于A和B数组都是有序数组,使用二分法查找B数组的每个成员是否在A数组中,时间复杂度为O(n*lgm)。如果n比m大,则查找A数组的成员是否在B数组中,时间复杂度为O(m*lgn)。
4.利用哈希
NSArray*aArray=@[@3,@4,@6,@8,@10];
NSArray*bArray =@[@4,@8,@11,@20];
for (NSNumber*numinaArray) {
if([bArraycontainsObject:num]){
NSLog(@"%@",num);
};
},或者用nsset
2.计算a的n次方
int test3(int a,int n){
if(n==0)
return 1;
else
return a*test3(a,n-1);
}
3.二叉树遍历
//输出数据和层数
void operation2(int ch,int level)
{
cout << ch <<"在第"<< level <<"层"<< endl;
}
前序遍历二叉树:
voidPreOrderTraverse(BiTree *T,int level){
if(T == NULL)
return;
/*此处表示对遍历的树结点进行的操作,根据你自己的要求进行操作,这里只是输出了结点的数据*///
operation1(T->data);operation2(T->data, level);//输出了层数
PreOrderTraverse(T->lchild, level +1);
PreOrderTraverse(T->rchild, level +1);
}
中序遍历二叉树:
void InOrderTraverse(BiTree *T,int level){
if(T==NULL)
return;
InOrderTraverse(T->lchild,level+1);
operation2(T->data, level);//输出了层数
InOrderTraverse(T->rchild,level+1);
}
后序遍历二叉树:
void PostOrderTraverse(BiTree *T,int level){
if(T==NULL) return;
PostOrderTraverse(T->lchild,level+1);
PostOrderTraverse(T->rchild,level+1);
operation2(T->data, level);//输出了层数
}
4.二叉树交换左右结点:
void exchange(BTree *T){
BTree *temp = NULL;
if(rt->lchild == NULL && rt->rchild == NULL)
return;
else{
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
if(T->lchild)
exchange(T->lchild);
if(T->rchild)
exchange(T->rchild);
}
判断链表是否有环
bool exitLoop(Node *head){
Node *fast,*slow;
slow = fast = head;
while(slow !=NULL&fast->next!=NULL){
slow = slow ->next;
fast = fast->next->next;
if(slow == fast){
return true;
}
}
return false;
}
交换相邻的两个结点:
//根据结点的data来寻找这个结点的前一个结点
List FindPrevious( ElementType x, List Head)
{
List P;
P = Head;
while( P->next != NULL && P->next->x != x )
{
P = P->next;
}
if ( P->next == NULL )
return NULL;
else
return P;
}
void SwapAdjacentElements( List Head, List p1, List p2 )
{
if ( p1->next != p2 ){
printf("不是相邻的节点");
return;
}
else{
Position p0;
p0 = FindPrevious( p1->x, L );
p1->next = p2->next;
p2->next = p1;
p0->next = p2;
return;
}
}
字符串按单词逆序算法
例如,给定字符串“I am a student”按单词逆序输出为“student a am I”
//指定两个位置front指针在首端,end指针在末尾,对里面的元素进行逆序
思路:对于字符串I am a student”采用先单词内部局部逆序,字符串变为"I ma a tneduts",然后再将整个字符串逆序得到最终字符串变为“student a am I”。
void ReverseWord(char*front,char*end)
{
while(front
{
chartemp=*front;
*front++=*end;
*end--=temp;
}
}
char* Reverse(char*s)
{
char*pre=s;
char*current=s;
//pre和current两个指针代表要逆序的范围,current是大的那一个指针
while(*current!='\0')
{
if(*current==' ')
{
ReverseWord(pre,current-1);
current++;
pre=current;
}
else
{
current++;
}
}
ReverseWord(pre,current-1); //由于最后一位不是空格,所以还需要特殊逆序一下
ReverseWord(s,current-1);
return s;
}
字符串转数字
int strToInt(char*string){
if(string==NULL) {
return0;
}
intnumber =0;
while(*string!=0) {
number = number*10+*string-'0';
++string;
}
returnnumber;
}
斐波那契数列:
int qbnx(int n){
if(n<1) {
return0;
}
else if(n==1) {
return 1;
}
else if(n==2) {
return 1;
}
int val =qbnx(n-1)+qbnx(n-2);
return val;
}
for(int i=1; i<=6; i++) { //输出斐波那契数列
printf("%d",qbnx(i));
}