SwordOffer

#include <iostream>
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include <vector>
#include <stack>
#include <iterator>
#include <Query.h>
using namespace std;

/*****************************************************************************
顺序二维数组查找
*****************************************************************************/
bool Find(vector<vector <int>> array, int target)
{
	int rows = array.size();
	int columns = array[0].size();

	bool found = false;
	if (rows <= 0 && columns <= 0)
	{
		return found;
	}

	int row = 0, column = columns - 1;
	while (row < rows&&column >= 0 && array[row][column] != NULL)
	{
		if (array[row][column] == target)
		{
			found = true;
			break;
		}
		else if (array[row][column]>target)
		{
			column--;
		}
		else
		{
			row++;
		}
	}
	return found;
}

/*****************************************************************************
替换空格
*****************************************************************************/
void replaceSpace(char *str, int length) {
	if (str == NULL)
	{
		return;
	}
	int spaceLength = 0;
	char *arr = str;
	while (*arr != '\0')
	{
		if (*arr == ' ')
		{
			spaceLength++;
		}
		arr++;
	}
	arr = str;
	int dstLength = length + 2 * spaceLength + 1;
	length += 1;
	while (length >= 0 && dstLength >= 0 && dstLength > length)
	{
		if (arr[length] == ' ')
		{
			arr[dstLength--] = '0';
			arr[dstLength--] = '2';
			arr[dstLength--] = '%';

		}
		else
		{
			arr[dstLength--] = arr[length];
		}
		--length;
	}
}

/*****************************************************************************
链表倒序打印
*****************************************************************************/
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
};

vector<int> printListFromTailToHead(struct ListNode* head) 
{
	vector<int> str;
	if (head != NULL)
	{
		if (head->next != NULL)
		{
			str = printListFromTailToHead(head->next);
		}
		str.push_back(head->val);
	}
	return str;
}

/*****************************************************************************
字符串递归倒序打印
*****************************************************************************/
vector<char> printfFromTailToHead(char *str)
{
	vector<char> dst;
	if (*str != '\0')
	{
		if (*(str + 1) != '\0')
		{
			dst = printfFromTailToHead(++str);
			dst.push_back(*str);
		}
	}
	return dst;
}


/*****************************************************************************
根据前序遍历和中序遍历的数组值,重新构建二叉树
*****************************************************************************/

typedef struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

struct TreeNode *ReconstructTreeCode(vector<int> pre, int startPreOrder, int endPreOrder,
	vector<int> in, int startInOrder, int endInOrder)
{
	int rootValue = pre[startPreOrder];
	TreeNode* root = new TreeNode(rootValue);

	if (startPreOrder == endPreOrder)//判断终止条件
	{
		if (startInOrder == endInOrder && pre[startPreOrder] == in[startInOrder])
		{
			return root;
		}
		else
		{
			return NULL;
		}
	}

	int rootInorder = startInOrder; //对中序遍历进行扫描,得到前序遍历的第一个结点的值和下标
	while (rootInorder <= endInOrder&&in[rootInorder] != rootValue)
	{
		++rootInorder;
	}

	if (rootInorder == endInOrder && in[rootInorder] != rootValue)
	{
		return NULL;
	}

	int leftLength = rootInorder - startInOrder;
	int  leftPreorderEnd = startPreOrder + leftLength;

	if (leftLength > 0)  //进行递归调用
	{
		root->left = ReconstructTreeCode(pre, startPreOrder + 1, leftPreorderEnd,
			in, startInOrder, rootInorder - 1);
	}

	if (leftLength < endPreOrder - startPreOrder)
	{
		root->right = ReconstructTreeCode(pre, leftPreorderEnd + 1, endPreOrder,
			in, rootInorder + 1, endInOrder);
	}

	return root;
}

struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) {

	int length = pre.size();
	if (pre.empty() || in.empty() || 0 >= length)
	{
		return NULL;
	}
	return ReconstructTreeCode(pre, 0, length - 1, in, 0, length - 1);
}

/*****************************************************************************
两个队列实现一个栈的功能
*****************************************************************************/
class Solution
{
public:
	void push(int node) {
		stack1.push(node);
	}

	int pop() {
		int temp;
		if (stack2.empty())
		{
			while (!stack1.empty())
			{
				temp = stack1.top();
				stack2.push(temp);
				stack1.pop();
			}
		}
		temp = stack2.top();
		stack2.pop();
		return temp;
	}

private:
	stack<int> stack1;
	stack<int> stack2;
};


/*****************************************************************************
函数: int minNumberInRotateArray(vector<int> rotateArray)
功能: 输入一个非递减序列的一个旋转,输出旋转数组的最小元素
*****************************************************************************/
int minNumberInRotateArray(vector<int> rotateArray) {
	if (rotateArray.size() <= 0)
	{
		return 0;
	}
	int end = rotateArray.size() - 1;
	int start = 0;
	int mid = start;
	while (rotateArray[start] >= rotateArray[end])
	{
		if ((end - start) == 1)
		{
			mid = end;
			break;
		}
		mid = (end + start) / 2;
		if (rotateArray[mid] == rotateArray[start] && rotateArray[start] == rotateArray[end])
		{
			int result = rotateArray[start];
			for (int i = start + 1;i <= end;++i)
			{
				if (result > rotateArray[i])
				{
					result = rotateArray[i];
				}
			}
			return result;
		}
		if (rotateArray[mid] >= rotateArray[start])
		{
			start = mid;
		}
		else if (rotateArray[mid] <= rotateArray[end])
		{
			end = mid;
		}
	}
	return rotateArray[mid];
}

/*****************************************************************************
分波那挈数列
*****************************************************************************/
int Fibonacci(int n)
{
	int abc[] = { 0,1 };
	if (n < 0)
	{
		return abc[0];
	}
	else if (n <= 1)
	{
		return abc[n];
	}

	int fibN = 0;
	int fib1 = 0;
	int fib2 = 1;
	for (int i = 2;i <= n;i++)
	{
		fibN = fib1 + fib2;
		fib1 = fib2;
		fib2 = fibN;
	}
	return fibN;
}

/*****************************************************************************
青蛙跳台阶问题,分波那挈
*****************************************************************************/
int jumpFloor(int number) {
	if (number <= 0)
	{
		return 0;
	}
	int number1 = 0;
	int number2 = 1;
	int numberN = 0;
	for (int i = 1;i <= number;i++)
	{
		numberN = number1 + number2;
		number1 = number2;
		number2 = numberN;
	}
	return numberN;
}

/*****************************************************************************
变态跳台阶问题,分波那挈
*****************************************************************************/
int jumpFloorII(int number) {
	int number2 = 1, numberN = 0;
	if (number <= 0)
	{
		return 0;
	}
	else if (number == 1 )
	{
		return 1;
	}
	for (int i = 2;i <= number;i++)
	{
		numberN = 2*number2;
		number2 = numberN;
	}
	return numberN;
}

/*****************************************************************************
矩形覆盖,分波那挈
*****************************************************************************/
int rectCover(int number) {
	int matrix[] = { 1,1 };
	if (number <= 0)
	{
		return 0;
	}

	if (number == 0 || number == 1)
	{
		return matrix[number];
	}

	int numberN = 0;
	for (int i = 2;i <= number;i++)
	{
		numberN = matrix[0] + matrix[1];
		matrix[0] = matrix[1];
		matrix[1] = numberN;
	}
	return numberN;
}

/*****************************************************************************
二进制中1的个数
*****************************************************************************/
int  NumberOf1(int n) {
	int count;
	while (n)
	{
		++count;
		n = n&(n - 1);
	}
	return count;
}

/*****************************************************************************
数值的整数次方
*****************************************************************************/
bool Equal(double number1, double number2)
{
	if (fabs(number1 - number2) < 0.0000001)
	{
		return true;
	}
	else
	{
		return false;
	}
}

double Power(double base, int exponent) {
	int fabs_exponent;
	double result=1.0;
	if (Equal(base, 0.0))
	{
		if (exponent<0)
		{
			cout << "The exponent data is invalidInput" << endl;
			return 0.0;
		}
		else
		{
			return 0.0;
		}
	}

	if (Equal(base, 1.0))
	{
		return 1.0;
	}

	fabs_exponent = fabs(exponent);
	for (int i = 1;i <= fabs_exponent;i++)
	{
		result = result*base;
	}
	if (exponent < 0)
	{
		result = 1.0 / result;
		return result;
	}
	else
	{
		return result;
	}
	
}


/*****************************************************************************
函数decomp_integer对n分解素因数,分解后的素数存入facArr数组,并返回因子的个数
*****************************************************************************/
int fenjieInteger(unsigned long number ,unsigned long *dst)
{
	unsigned long yinZi;      //n的可能的一个因子
	int count;

	if (number<4)        //4以内的数,不需要分解
	{
		dst[0] = number; return 1;
	}

	count = 0;
	//下面的while循环为2试出n,直到2不是n的因子为止
	while ((number & 1) == 0) // 这里判断偶数用 (n &1)==0,这比(n % 2)==0更快
	{
		dst[count++] = 2;  number /= 2;
	}

	yinZi = 3;  //用3到sqrt(n)之间的奇数试除
	while (yinZi*yinZi <= number) // fac*fac <= n
	{
		while (number % yinZi == 0)
		{
			dst[count++] = yinZi;
			number /= yinZi;
		}
		yinZi += 2;
	}
	if (number == 1)
		return count;

	dst[count++] = number;
	return count;
}




void InvertSort(int *str,int length)
{
	int* start = str;
	int* end = str + length - 1;
	int mid = 0;
	while ((end - start) != 1)
	{
		mid = (end - start) / 2;
		if (str[mid] > *start)
		{
			mid++;
			start = start + mid;
		}
		else
		{
			end = str + mid;
		}
	}
}

void sqrt1(float a)
{
	float x;      //x为所求结果  
	int i = 100;    //控制循环的次数a  
	printf("请输入要开方的数:");
	scanf("%f", &a);
	x = a / 2;
	while (i--)
	{
		x = (x + a / x) / 2;
	}
	printf("开方的结果为:%f\n", x);
}



/*****************************************************************************
函数: double CubeRoot(double)
功能: 求解一个数的立方根
算法: 牛顿法
使用: 输入一个实数,输出输入实数的立方根
*****************************************************************************/
double CubeRoot(const double stuff)
{
	const double  precision = 0.00001; /* 精度 */
	double nextX, currentX;
	double squareX;     /* 当前值 的平方 */
	double cubeX;       /* 下个解 的立方 */
	bool flag;

	currentX = stuff;  /* 初始化当前的值为X */

	if (stuff == 0)
	{
		return stuff;
	}
	else
	{
		do
		{
			squareX = currentX * currentX;
			nextX = (2 * currentX + stuff / squareX) / 3;       /* 牛顿迭代公式 */
			cubeX = nextX*nextX*nextX;
			if ((cubeX - stuff < precision) && (cubeX - stuff > -precision))
			{
				flag = TRUE;
			}
			else
			{
				flag = FALSE;
				currentX = nextX;
			}
		} while (flag == FALSE);
	}

	return nextX;
}

/*****************************************************************************
台阶问题,动态规划
*****************************************************************************/
int result[100];
int function(int n)
{
	int res;

	if (0 == n || 1 == n)
	{
		res = 1;
	}
	else 
	{
		res = function(n - 1) + function(n - 2);
	}
	result[n] = res;
	return res;
}

/****************************************************************************
背包问题,动态规划
*****************************************************************************/
int c[10][100] = { 0 };
void knap(int m, int n) {	//m为容量,n为物体总数量

	int i, j, w[10], p[10];		//w[i]第i个物体的重量,p[i]第i个物体的价值
	for (i = 1;i <= n + 1;i++)
		cin >> w[i] >> p[i];
		//scanf("%d,%d", &w[i], &p[i]);
	for (j = 0;j < m + 1;j++)
	{
		for (i = 1;i <= n;i++)
		{
			if (j<w[i])
			{
				c[i][j] = c[i - 1][j];	//c[i][j]前i个物体放入容量为j的背包的最大价值;
				continue;
			}
			else if (c[i - 1][j - w[i]] + p[i]>c[i - 1][j])
				c[i][j] = c[i - 1][j - w[i]] + p[i];
			else
				c[i][j] = c[i - 1][j];
		}
	}
	cout << c[i][j] << endl;
}

//猴子分苹果的问题
void breaEatApple(int brea)
{
	int temp, count, i;
	int remain = 1, brk = 0;
	scanf("%d", &brea);
	for (count = brea + remain;;count += brea)
	{
		temp = count;
		for (i = 0;i < brea;i++)
		{
			if (temp%brea != remain)
			{
				brk = 1;
				break;
			}
			temp = temp - remain - temp / brea;
		}
		if (!brk&&temp > 0)
			break;
		brk = 0;
	}
	printf("%d", count);
}


int* arrayPrint(int **arr, int n) {//时间复杂度为2*N*N*N
	for (int i = 0;i < 4;i++)
	{
		for (int j = 0;j < 4;j++)
		{
			cout << arr[i][j] << " ";
		}
	}

	int i, j, m, temp = 0;
	int dst[100] = { 0 };
	for (i = 0;i < 2 * n - 1;i++)
	{
		for (j = 0;j < n;j++)
		{
			for (m = 0;m < n;m++)
			{
				if ((m - j) == (n - 1 - i))
				{
					dst[temp] = arr[j][m];
					++temp;
					break;
				}
			}
		}
	}
	return dst;
}

int *arrPrint1(int **src, int n)//时间复杂度为N*N
{
	int i = 0, j = n - 1, temp, count = 0, temp2=1;
	int *dst = new int(n*n);
	while(j+1)
	{
		i = 0;
		for (temp = j;temp < n;temp++)
		{
			dst[count++] = src[i][temp];
			i++;
		}
		--j;
	}
	while (temp2 < n)
	{
		j = 0;
		for (i = temp2;i < n;i++,j++)
		{
			dst[count++] = src[i][j];
		}
		++temp2;
	}
	return dst;
}


int main(int argc, char* argv[])
{
	
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值