ARST 第五周打卡
Algorithm : 做一个 leetcode 的算法题
///////////////////////////////////////////////////////////////////
// 1. 与替换空格类似的题目
// 有两个排序数组A1, A2, A1的末尾有足够多的的空间容纳A2,实现一个函数,把A2中所有数字插入A1中且所有的数字的有序的!
//方法一:从前往后比较,需要额外的空间
//时间复杂度O(2n), 空间复杂度O(n)
void MergeTwoArray1(int aiArrayA[], int iNumA, int aiArrayB[], int iNumB)
{
const int MAX_ARRAY_COUNT = iNumA + iNumB;
vector<int> vect(MAX_ARRAY_COUNT, 0); int i = 0, j = 0, k = 0; // 1. 比较两个数组,把较小的加入新的数组
while (i < iNumA &&j < iNumB)
{
if (aiArrayA[i] < aiArrayB[j])
{
vect[k++] = aiArrayA[i++];
}
else
{
vect[k++] = aiArrayB[j++];
}
} // 2.把剩余的元素加到新数组
while (i < iNumA)
{
vect[k++] = aiArrayA[i++];
} while (j < iNumB)
{
vect[k++] = aiArrayB[j++];
} // 3.把数据复制到数组A
k = 0;
for (auto it : vect)
{
aiArrayA[k++] = it;
}
}
// 方法二:从后往前比较,不需要额外的空间
//时间复杂度O(n), 空间复杂度O(1)
void MergeTwoArray2(int aiArrayA[], int iNumA, int aiArrayB[], int iNumB)
{
int iNewNum = iNumA + iNumB - 1;
int i = iNumA - 1;
int j = iNumB - 1; // 从数组后往前比较,就不存在重叠的情况了!!!
while (i >= 0 && j >= 0)
{
if (aiArrayA[i] > aiArrayB[j])
{
aiArrayA[iNewNum--] = aiArrayA[i--];
}
else
{
aiArrayA[iNewNum--] = aiArrayB[j--];
}
} while (i >= 0)
{
aiArrayA[iNewNum--] = aiArrayA[i--];
} while (j >= 0)
{
aiArrayA[iNewNum--] = aiArrayB[j--];
} }
//////////////////////////////////////////////////////////////////////////////////////////////
// 2.题目五:从尾到头打印链表
// 方法一:时间复杂度O(n),空间复杂度O(n)
template <typename TYPE>
void ReversePrintList1(ListNode<TYPE>* pNode)
{
assert(NULL != pNode); stack<ListNode<TYPE>*> stStack;
while (pNode)
{
stStack.push(pNode);
pNode = pNode->m_pNextNode;
} cout << "链表逆序打印: " << endl;
while (!stStack.empty())
{
ListNode<TYPE>* pTmpNode = stStack.top();
printf("%02d -> ", pTmpNode->m_stData);
stStack.pop();
} putchar(10); }
// 方法二:递归实现(递归实现也是类似栈实现)
// 时间复杂度O(n), 空间复杂度O(n)
// 注意:如果链表非常长,会导致函数调用层级很深,从而导致函数调用栈溢出!!!
template <typename TYPE>
void ReversePrintLisHEAP_TYPE(ListNode<TYPE>* pNode)
{
if (!pNode)
{
return;
} ReversePrintLisHEAP_TYPE(pNode->m_pNextNode); printf("%02d -> ", pNode->m_stData);
}
///////////////////////////////////////////////////////////////////////////////////////
// // 3.题目六:重建二叉树
// 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出改二叉树
struct BinaryTreeNode
{
int m_iValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight; BinaryTreeNode(int iValue = 0, BinaryTreeNode* pLeft = NULL, BinaryTreeNode* pRight = NULL)
:m_iValue(iValue), m_pLeft(pLeft), m_pRight(pRight)
{ }
}; BinaryTreeNode* RebuildTree(int* pPreStart, int* pPreEnd, int* pInStart, int* pInEnd)
{
if (pPreStart > pPreEnd || pInStart > pInEnd)
{
return NULL;
} // 1.建立根节点(前序遍历第一个元素)
BinaryTreeNode* pRoot = new BinaryTreeNode(*pPreStart);
if (!pRoot)
{
return NULL;
} // 2.找到中序根节点
int* p = pInStart;
while (p <= pInEnd && *p != pRoot->m_iValue)
{
p++;
} int iLeftLength = p - pInStart;
int* pLeftPreEnd = pPreStart + iLeftLength; // 3.构建左子树
if (iLeftLength > 0)
{
pRoot->m_pLeft = RebuildTree(pPreStart + 1, pLeftPreEnd, pInStart, p - 1);
} // 4.构建右子树
if (iLeftLength < (pPreEnd - pPreStart))
{
pRoot->m_pRight = RebuildTree(pLeftPreEnd + 1, pPreEnd, p + 1, pInEnd);
} return pRoot;
} BinaryTreeNode* RebuildBinaryTree(int* piPreOrderArray, int* piInorderArray, int iLength)
{
if (NULL == piPreOrderArray || NULL == piInorderArray || iLength <= 0)
{
return NULL;
} return RebuildTree(piPreOrderArray, piPreOrderArray + iLength - 1, piInorderArray, piInorderArray + iLength -1);
} void DestroyTree(BinaryTreeNode* pTree)
{
if (pTree)
{
// 释放左子树
DestroyTree(pTree->m_pLeft); // 释放右子树
DestroyTree(pTree->m_pRight); delete pTree;
pTree = NULL;
}
} // 后序遍历
void PostTraversal(BinaryTreeNode* pNode)
{
if (pNode)
{
PostTraversal(pNode->m_pLeft);
PostTraversal(pNode->m_pRight);
printf("%02d -> ", pNode->m_iValue);
}
} void RebuildBinaryTreeTestFunc()
{
cout << "\n\n --------------- RebuildBinaryTreeTestFunc Start -------------->" << endl;
const int MAX_TREE_NODE_COUNT = 8; //前序遍历序列(中 -> 左 -> 右)
int aiPreOrderArray[MAX_TREE_NODE_COUNT] = {1, 2, 4, 7, 3, 5, 6, 8}; //中序遍历序列(左 -> 中 -> 右)
int aiInorderArray[MAX_TREE_NODE_COUNT] = {4, 7, 2, 1, 5, 3, 8, 6}; //后序遍历序列(左 -> 右 -> 中)
int aiPostArray[MAX_TREE_NODE_COUNT] = {7, 4, 2, 5, 8, 6, 3, 1}; BinaryTreeNode* pTree1 = RebuildBinaryTree(aiPreOrderArray, aiInorderArray, MAX_TREE_NODE_COUNT);
if (pTree1)
{
// 后序遍历
PostTraversal(pTree1);
putchar(10); // 施法资源
DestroyTree(pTree1);
} cout << "\n\n --------------- RebuildBinaryTreeTestFunc End -------------->" << endl; }
////////////////////////////////////////////////////////////////////////////////////
// 4.题目七:用两个栈实现队列
// 题目:用两个栈实现一个队列,队列的声明如下:
template <typename TYPE>
class CQueue
{
public:
CQueue(){}
~CQueue(){} void AppendTail(const TYPE& node); TYPE DeleteHead(); private:
stack<TYPE> m_stPushStack;
stack<TYPE> m_stPopStack; }; // 方法一:
// 插入时 --> m_stPopStack不为空,将元素压入m_stPushStack;
// 删除时 --> m_stPushStack不为空,将元素压入 m_stPopStack; // 方法二:
// 插入时 --> 直接往 m_stPushStack 插入新元素
// 删除时 --> 如果m_stPopStack为空,插入m_stPushStack中元素,否则直接弹出元素
template <typename TYPE>
TYPE CQueue<TYPE>::DeleteHead()
{
#if 0
while (!m_stPushStack.empty())
{
m_stPopStack.push(m_stPushStack.top());
m_stPushStack.pop();
} #else
if (m_stPopStack.empty())
{
while (!m_stPushStack.empty())
{
m_stPopStack.push(m_stPushStack.top());
m_stPushStack.pop();
}
} #endif TYPE tmp = m_stPopStack.top();
m_stPopStack.pop(); return tmp;
} template <typename TYPE>
void CQueue<TYPE>::AppendTail(const TYPE& node)
{
#if 0
while (!m_stPopStack.empty())
{
m_stPushStack.push(m_stPopStack.top());
m_stPopStack.pop();
} m_stPushStack.push(node);
#else m_stPushStack.push(node); #endif
} void QueueWithTwoStackTestFunc()
{
cout << "\n\n --------------- QueueWithTwoStackTestFunc Start -------------->" << endl;
CQueue<int> stQueue;
stQueue.AppendTail(1);
stQueue.AppendTail(2);
stQueue.AppendTail(3);
cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl; stQueue.AppendTail(4);
stQueue.AppendTail(5);
stQueue.AppendTail(6);
cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl;
cout << "Queue Pop Node: " << stQueue.DeleteHead() << endl; cout << "\n\n --------------- QueueWithTwoStackTestFunc End -------------->" << endl; }
/////////////////////////////////////////////////////////////////////////////////////////////
// 5.用两个队列实现一个栈
template <typename TYPE>
class CStack
{
public:
CStack(){}
~CStack(){} public:
void AppendTail(const TYPE& value); TYPE DeleteHead(); private:
queue<TYPE> m_stQueue1;
queue<TYPE> m_stQueue2;
}; template <typename TYPE>
TYPE CStack<TYPE>::DeleteHead()
{
TYPE head;
if (m_stQueue1.empty())
{
while (m_stQueue2.size() > 1)
{
m_stQueue1.push(m_stQueue2.front());
m_stQueue2.pop();
} head = m_stQueue2.front();
m_stQueue2.pop();
}
else
{
while (m_stQueue1.size() > 1)
{
m_stQueue2.push(m_stQueue1.front());
m_stQueue1.pop();
} head = m_stQueue1.front();
m_stQueue1.pop();
} return head;
} template <typename TYPE>
void CStack<TYPE>::AppendTail(const TYPE& value)
{
m_stQueue1.push(value);
} void StackWithTwoQueueTestFunc()
{
cout << "\n\n --------------- StackWithTwoQueueTestFunc Start -------------->" << endl;
CStack<int> stStack;
stStack.AppendTail(1);
stStack.AppendTail(2);
stStack.AppendTail(3); cout << "Stack Pop Node: " << stStack.DeleteHead() << endl; stStack.AppendTail(4);
stStack.AppendTail(5);
stStack.AppendTail(6);
cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
cout << "Stack Pop Node: " << stStack.DeleteHead() << endl;
cout << "Stack Pop Node: " << stStack.DeleteHead() << endl; cout << "\n\n --------------- StackWithTwoQueueTestFunc End -------------->" << endl; }
Review : 阅读并点评一篇英文技术文章
Tips : 学习一个技术技巧
排序算法学习:https://mp.weixin.qq.com/s/iiH2wSG-hVeUHxIsfuu9gw
Share : 分享一篇有观点和思考的技术文章
ARST 第五周打卡的更多相关文章
- ARST第三周打卡
Algorithm : 做一个 leetcode 的算法题 //二位数组查找 题目描述 //在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- 20145213《Java程序设计》第五周学习总结补充
20145213<Java程序设计>第五周学习总结补充 教材学习内容总结 欠的账都是要还的!第九章的内容躲过对酒当歌的夜,躲不过四下无人的街.由于第五周贪玩,疏忽冷落了Collection ...
- 20145213《Java程序设计》第五周学习总结
20145213<Java程序设计>第五周学习总结 教材学习内容总结 "素衣莫起风尘叹,犹及清明可到家."每每念此,不得不心疼自己.古人清明长假都进城耍了,还担心自己清 ...
- 20145304 第五周Java学习报告
20145304<Java程序设计>第5周学习总结 教材学习内容总结 1.使用try.catch: 如果使用了try.catch,编译时会尝试执行try区块中的程序代码,如果有错误,执行流 ...
- 20145330第五周《Java学习笔记》
20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...
- 20145337 《Java程序设计》第五周学习总结
20145337 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 JAVA中的所有错误都会被包装成对象,如果你愿意,可以尝试执行并捕捉代表错误的对象后做一些处理.使用了try ...
- Linux内核设计第五周——扒开系统调用三层皮(下)
Linux内核设计第五周 ——扒开系统调用三层皮(下) 一.知识点总结 1.给MenuOS增加新的命令的步骤 更新menu代码到最新版 test.c中main函数里,增加MenuConfig() 增加 ...
- 项目评价及第五周PSP的发布
5TH 各组作品ALPHA发布体会 1:俄罗斯方块组做了主要功能,这个项目我自己原来拿c语言做过一部分,感觉此游戏细节特别多,逻辑思维需要组织,以为我的水准来说,感觉做的挺好的. ...
- 20145218 《Java程序设计》第五周学习总结
20145218 <Java程序设计>第五周学习总结 教材学习内容总结 异常 程序中总有些意想不到的状况所引发的错误,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失 ...
随机推荐
- delphi将字符串转换成stringlist
function StrToList(const sString, Token: string): TStringList;var sTmp: string; iPos: Integer; Tokle ...
- SpringJunitTest
1.用MockBean和assert,而不是输出 import org.springframework.boot.test.mock.mockito.MockBean;MockBean import ...
- 刘汝佳dicnic模板
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> #in ...
- socket.io 的使用
socket.io 是对 websocket 的封装,当你在客户端使用 socket.io 那么服务器也要对应的使用 目录结构: 使用方法: 客户端: socket.emit() 是提交数据,sock ...
- JAVA类定义的修饰
命名类的访问权限public.protected.friendly,private 这四个的权限, 作用域: 当前(父,超)类: 同一Package: 派生(子)类: 其他Package: publi ...
- 2.JSON.stringify()Object
JSON.stringify() JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符 ...
- 前端知识点回顾之重点篇——AJAX
Ajax(Asynchronous JavaScript and XML) 这种技术就是无须刷新页面即可从服务器中取得数据,但不一定是XML数据.在原生方法上,Ajax技术的核心是XMLHttpReq ...
- Android : 高通平台的HVX简介及调试
一.HVX简介 HVX(“Hexagon矢量扩展”,Hexagon-六边形.Vector-矢量.Extensions-扩展)是Hexagon 680 DSP的典型特性,能够在执行图像处理应用中的计算负 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下
笔记 4.Feign结合Hystrix断路器开发实战<下> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.feign结合Hystrix ...
- switch语句 initialization of 'XXX' is skipped by 'case' label 原因及解决办法--块语句的作用
出错代码段: switch (t) { case 0: int a = 0; break; default: break; }编译时提示:“error C2361: initialization ...