斐波那契数列数组去重数组合并旋转数组数组与某一值相加

Posted 蚍蜉撼树谈何易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斐波那契数列数组去重数组合并旋转数组数组与某一值相加相关的知识,希望对你有一定的参考价值。

一.斐波那契数列的多种求法
1.1递归求
思路:

//利用双层递归
int fib_version1(int n)
{
  if(n==1||n==2)
  {
   return 1;
  }
  if(n<1)
  {
   return 0;
  }
  return fib_version(n-1)+fib_version(n-2);//斐波那契数列等于前两项的和
}

2.2利用循环求,借助临时变量

int fib_version2(int n)
{
if(n==1||n==2)
  {
   return 1;
  }
  if(n<1)
  {
   return 0;
  }
  int a=1;
  int b=1;
  int result=0;
  for(int i=3;i<n;i++)
  {
     result=a+b;
     a=b;
     b=result;
  }
  return result;
}

2.3最优递归算法
//采用尾递归的方式

int fib_version3(int first,int second,int n)
{
if(n==1||n==2)
{
return 1;
}
if(n==3)
{
return first+end;//类似于采用中间变量记录,不过此时first,second来记录
}
return fib_version3(second,first+second,n-1);
}

二、数组去重

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
int my_unique(int arr[], int len)
{
	if (len < 2)
	{
		return len;
	}
	int index = 0;//index用来记录数组下标,从0开始
	for (size_t i = 1; i < len; i++)
	{
		if (arr[index] == arr[i])
		{
			continue;
		}
		else
		{
			arr[++index] = arr[i];
		}
	}
	return index + 1;
}
void test01()
{
	int arr[] = { 0,0,1,1,2,2,2,3,3,4,5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int size=my_unique(arr, len);
	printf("去重前\\n");
	for (size_t i = 0; i < len; i++)
	{
		printf("%d\\t", arr[i]);
	}
	printf("去重后\\n");
	for (size_t i = 0; i < size; i++)
	{
		printf("%d\\t", arr[i]);
	}


}
int main(void)
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}
//leecode链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

三、数组的合并
题:前提:数组1和数组2都是有序数组
解题思路:首先记录它最后一个下标,然后依次从后向前插入

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
void merge(int *arr1,int maxsize, int len1, int *arr2, int len2)
{
	if (arr1 == NULL || arr2 == NULL)
	{
		return;
	}
	int m = len1 - 1;//标记数组一中最大元素下标
	int n = len2 - 1;//标记数组二中最大元素下标
	maxsize = maxsize - 1;//从数组最大元素开始插入
	printf("%d\\n", maxsize);
	
	while (n>=0)
	{
		if (m>=0&&(arr1[m] > arr2[n]))
		{
			arr1[maxsize--] = arr1[m--];
		}
		else
		{
			arr1[maxsize--] = arr2[n--];
		}
	}

}
void test01()
{
	int arr1[7] = { 1,3,5 };
	int arr2[4] = { 2,4,6,8 };
	merge(arr1, 7, 3, arr2, 4);
	printf("after the merge\\n");
	for (size_t i = 0; i < 7; i++)
	{
		printf("%d\\t", arr1[i]);
	}
	printf("\\n");

}
int main(void)
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

四、旋转数组
//向右旋转

//
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
void reverse_arr(int* arr, int start, int end)
{
	if (arr == NULL)
	{
		return;
	}
	int temp;
	while (start < end)
	{
		temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		start++;
		end--;
	}
}
void test01()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	printf("请输入你要旋转的个数");
	int k;
	scanf("%d", &k);
	k %= len;//计算的是有效旋转个数
	printf("反转前\\n");
	for (size_t i = 0; i < len; i++)
	{
		printf("%d\\t", arr[i]);
	}
	printf("\\n");
	reverse_arr(arr, 0, len-k - 1);//先逆置前面的元素
	reverse_arr(arr, len-k, len - 1);//再逆置之后的n个元素
	reverse_arr(arr, 0, len - 1);//整体做个逆置
	printf("反转后\\n");
	for (size_t i = 0; i < len; i++)
	{
		printf("%d\\t", arr[i]);
	}
	printf("\\n");

}
int main(void)
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

四、数组与某一值相加
例:[1,2,3,0]+34=[1,2,6,4];
[9,9,7]+3=[1,0,0,0];
要求:输出它相加后的数组,同时首位不可以为0;

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
	if (A == NULL)
	{
		return;
	}
	int len = log10(K) + 1;//获取相加数字的有效位数
	int size = ASize > len ? ASize + 1 : len + 1;//获取开辟的数组位数
	*returnSize = size;
	int* newspace1 = (int*)malloc(sizeof(int) * size);
	memset(newspace1, 0, sizeof(int) * size);
	if (newspace1 == NULL)
	{
		return;
	}
	while ((ASize>0||K!=0)&&size>0)
	{
		if(ASize>0)
		K += A[--ASize];
		newspace1[--size] = K % 10;
		K /= 10;
	}
	*returnSize -= size;//这个是用来规避掉没有进位的情况
	return newspace1+size;//让它的指针向前移动size个字节,因为可能出现首元素为0(无进位情况)的情况。

}
void test01()
{
	int arr[] = { 1,2,0,0 };
	printf("%d\\n", arr[0]);
	int k = 34;
	int arr_size = sizeof(arr) / sizeof(arr[0]);
	
	int p_size = 0;
	int* p = addToArrayForm(arr, arr_size, k, &p_size);
	printf("%d\\n", p_size);
	for (size_t i = 0; i < p_size; i++)
	{
		printf("%d\\t", p[i]);
	}

	
}
int main(void)
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

以上是关于斐波那契数列数组去重数组合并旋转数组数组与某一值相加的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-旋转数组,斐波那契数列,比特1的个数

剑指offer

,c语言:利用数组求斐波那契数列的前20项

使用数组和 For 循环的斐波那契数列

数组:斐波那契数列

斐波那契数列:2.数组