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程序设计>第五周学习总结 教材学习内容总结 异常 程序中总有些意想不到的状况所引发的错误,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失 ...
随机推荐
- 发布web项目时,关于未能加载文件或程序集或它的某一个依赖项。拒绝访问的问题
asp.net的程序是发布再iis上面的嘛,然后iis里面呢选中你的程序,在右边菜单有个编辑权限.然后添加权限Everyone.设置文件夹只读为否
- 软件开发中什么是CI/CD
持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误. 持续部署(continuous d ...
- Golang 函数耗时统计
当时候需要去计算一段代码或一个程序所消耗时间的时候,就需要进行统计时间,用程序去计算某一段代码的执行所需要的时间远比用眼睛直接去看程序运行时间高很多. go语言中的time包中提供了函数来提供计算消耗 ...
- Leetcode题目215.数组中的第K个最大元素(中等)
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- Ubuntu 配置ISCSI服务
摘要:sudo apt-get install iscsitarget立刻搞定, 然后编辑配置文件:sudovim/etc/ietd.conf默认的配置文件, 有详细的配置说明和示例,本博先备份了事, ...
- Redis调试 Centos
https://zhuanlan.zhihu.com/p/67205845 https://www.cxc233.com/blog/e1d54234.html
- 使用Jsp +Js + Jquery + EasyUI + Servlet + Lucene,完成分页
步一:创建ArticleDao.java类 public class ArticleDao { public Integer getAllObjectNum(String keywords) thro ...
- BrowserUtils
import android.content.Context; import android.content.Intent; import android.net.Uri; public class ...
- OpenAPI规范入门
由于API对于我们的软件运行方式至关重要,因此记录我们的API对于确保我们大型IT组织中的每个人都了解正在发生的事情至关重要,这就是我们使用OpenAPI来帮助记录API规范的原因. 在本文中,我将向 ...
- Python多进程库multiprocessing创建进程以及进程池Pool类的使用
问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...