#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;
}
SwordOffer
最新推荐文章于 2024-08-16 09:29:32 发布