剑桥offer(11~20)
11.题目描述
class Solution {
public:
int NumberOf1(int n) {
int count = ;
unsigned int num = n;
while (num != ) {
if ((num & ) == ){
count++;
}
num = num >> ;
}
return count;
}
};
12题目描述
class Solution {
public:
double Power(double base, int exponent) {
double result=;
if (exponent == ){
return ;
}
else{
if (abs(exponent) == ){
return base;
}
result = base;
for (int i = ; i <= abs(exponent); i++){
result *= base;
}
}
if (exponent > ){
return result;
}
else{
return / result;
}
}
};
13.题目描述
class Solution {
public:
void reOrderArray(vector<int> &array) {
for (int i = ; i < array.size(); i++){
if(array[i]%==){
for(int j=i+;j< array.size();j++){
if((array[j]%==)){
int tmp = array[j];
for(int k =j;k>i;k--){
array[k]= array[k-];
}
array[i]=tmp;
break;
}
}
}
}
}
};
14.题目描述
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode*head = pListHead;
ListNode*nodeK=pListHead;
int len=;//链表总长
int index=;// if(k<=){
return NULL;
}
while(head!=NULL){
len++;
head=head->next;
}
if(k>len){
return NULL;
}
index = len-k; while(index--){
nodeK = nodeK->next;
}
return nodeK; }
};
15.题目描述
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) { ListNode* h = NULL;
ListNode* p = pHead;
while(p){
ListNode* tmp = p -> next;
p -> next = h;
h = p;
p = tmp;
}
return h;
} };
16.题目描述
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
/*
{
ListNode *head = NULL, *node = NULL;
while (pHead1 || pHead2){
if (((pHead1 == NULL) && (pHead2 != NULL)) || pHead1->val >= pHead2->val){
if (head){
node->next = pHead2;
node = pHead2;
}
else{
node = pHead2;
head = pHead2;
}
pHead2 = pHead2->next;
}
else if (((pHead2 == NULL) && (pHead1 != NULL)) || pHead1->val <= pHead2->val){
if (head){
node->next = pHead1;
node = pHead1;
}
else{
node = pHead1;
head = pHead1;
}
pHead1 = pHead1->next;
}
}
node->next=NULL;
return head;
}
*/
{
ListNode *head = NULL, *node = NULL;
if (pHead1 == NULL)
return pHead2;
if (pHead2 == NULL)
return pHead1;
while (pHead1 && pHead2){
if ( pHead1->val >= pHead2->val){
if (head){
node->next = pHead2;
node = pHead2;
}
else{
node = pHead2;
head = pHead2;
}
pHead2 = pHead2->next;
}
else if ( pHead1->val <= pHead2->val){
if (head){
node->next = pHead1;
node = pHead1;
}
else{
node = pHead1;
head = pHead1;
}
pHead1 = pHead1->next;
}
}
if (pHead1 == NULL){
node->next = pHead2;
}
if (pHead2 == NULL){
node->next = pHead1;
}
return head;
}
};
11.题目描述
12.题目描述
13.题目描述
14.题目描述
class Solution {
stack<int> data;
stack<int> mindata;
public:
void push(int value) {
data.push(value);
if (mindata.size() <= ){
mindata.push(value);
}
else if (value < mindata.top()){
mindata.push(value);
}
else if (value >= mindata.top()){
mindata.push(mindata.top());
}
}
void pop() {
data.pop();
mindata.pop();
}
int top() {
return mindata.top();
}
int min() {
return mindata.top();
}
};
15.题目描述
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
stack<int>tmp;
int size = pushV.size();
if(size == ) return false;
for(int i=,j=;i<size;){
tmp.push(pushV[i++]);
while(j<size && tmp.top() == popV[j]){
j++;
tmp.pop();
}
}
return tmp.empty();
}
};
16题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode *root) {
queue<TreeNode*>q;
vector<int>v;
TreeNode *node = root;
v.clear();
if(root == NULL){
return v;
}
q.push(node);
while(!q.empty()){
node = q.front();
q.pop();
if(!node){
continue;
}
v.push_back(node->val);
q.push(node->left);
q.push(node->right);
}
return v;
}
};
17.题目描述
//非递归
//非递归也是一个基于递归的思想:
//左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的
//最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看有子树是否符合条件
//即可,即使到达了左子树左子树也可以看出由左右子树组成的树还想右子树那样处理 //对于左子树回到了原问题,对于右子树,左子树的所有值都比右子树的根小可以暂时把他看出右子树的左子树
//只需看看右子树的右子树是否符合要求即可
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int size = sequence.size();
if(==size)return false; int i = ;
while(--size)
{
while(sequence[i++]<sequence[size]);
while(sequence[i++]>sequence[size]); if(i<size)return false;
i=;
}
return true;
}
}; BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 : ) 。
class Solution {
bool judge(vector<int>& a, int l, int r){
if(l >= r) return true;
int i = r;
while(i > l && a[i - ] > a[r]) --i;
for(int j = i - ; j >= l; --j) if(a[j] > a[r]) return false;
return judge(a, l, i - ) && (judge(a, i, r - ));
}
public:
bool VerifySquenceOfBST(vector<int> a) {
if(!a.size()) return false;
return judge(a, , a.size() - );
}
};
18.题目描述
class Solution {
vector<vector<int> >allRes;
vector<int> tmp;
void dfsFind(TreeNode * node , int left){
tmp.push_back(node->val);
if(left-node->val == && !node->left && !node->right)
allRes.push_back(tmp);
else {
if(node->left) dfsFind(node->left, left-node->val);
if(node->right) dfsFind(node->right, left-node->val);
}
tmp.pop_back();
}
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root) dfsFind(root, expectNumber);
return allRes;
}
};
19题目描述
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/ class Solution { public:
RandomListNode* searchNode(RandomListNode* pHead, int value){
RandomListNode* FHead = pHead;
if(!FHead)
return NULL;
while (FHead&&FHead->label != value){
FHead = FHead->next;
}
if (FHead&&FHead->label == value)
return FHead;
else
return NULL;
} public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead)
return NULL;
RandomListNode* pHead1 = pHead;
RandomListNode* newHead = NULL;
RandomListNode* FHead = NULL; //首先构造一个正顺序的链表
while (pHead1 != NULL){ RandomListNode *node = new RandomListNode(pHead1->label);
if (newHead == NULL){
newHead = node;
FHead = node;
}
else{
FHead->next = node;
FHead = FHead->next;
}
pHead1 = pHead1->next;
} pHead1 = pHead;
FHead = newHead;
while (pHead1 != NULL){
if(pHead1->random){
FHead->random = searchNode(newHead, (int)pHead1->random->label);
}
FHead = FHead->next;
pHead1 = pHead1->next;
}
return newHead;
}
};
思路2:
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
//复制原始链表的任一节点N并创建新节点N',再把N'链接到N的后边
void CloneNodes(RandomListNode* pHead)
{
RandomListNode* pNode=pHead;
while(pNode!=NULL)
{
RandomListNode* pCloned=new RandomListNode();
pCloned->label=pNode->label;
pCloned->next=pNode->next;
pCloned->random=NULL; pNode->next=pCloned; pNode=pCloned->next;
}
}
//如果原始链表上的节点N的random指向S,则对应的复制节点N'的random指向S的下一个节点S'
void ConnectRandomNodes(RandomListNode* pHead)
{
RandomListNode* pNode=pHead;
while(pNode!=NULL)
{
RandomListNode* pCloned=pNode->next;
if(pNode->random!=NULL)
pCloned->random=pNode->random->next;
pNode=pCloned->next;
}
}
//把得到的链表拆成两个链表,奇数位置上的结点组成原始链表,偶数位置上的结点组成复制出来的链表
RandomListNode* ReConnectNodes(RandomListNode* pHead)
{
RandomListNode* pNode=pHead;
RandomListNode* pClonedHead=NULL;
RandomListNode* pClonedNode=NULL; //初始化
if(pNode!=NULL)
{
pClonedHead=pClonedNode=pNode->next;
pNode->next=pClonedNode->next;
pNode=pNode->next; }
//循环
while(pNode!=NULL)
{
pClonedNode->next=pNode->next;
pClonedNode=pClonedNode->next;
pNode->next=pClonedNode->next;
pNode=pNode->next;
} return pClonedHead; }
//三步合一
RandomListNode* Clone(RandomListNode* pHead)
{
CloneNodes(pHead);
ConnectRandomNodes(pHead);
return ReConnectNodes(pHead);
}
};
class Solution {
public:
/*
1、复制每个节点,如:复制节点A得到A1,将A1插入节点A后面
2、遍历链表,A1->random = A->random->next;
3、将链表拆分成原链表和复制后的链表
*/
RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead) return NULL;
RandomListNode *currNode = pHead;
while(currNode){
RandomListNode *node = new RandomListNode(currNode->label);
node->next = currNode->next;
currNode->next = node;
currNode = node->next;
}
currNode = pHead;
while(currNode){
RandomListNode *node = currNode->next;
if(currNode->random){
node->random = currNode->random->next;
}
currNode = node->next;
}
//拆分
RandomListNode *pCloneHead = pHead->next;
RandomListNode *tmp;
currNode = pHead;
while(currNode->next){
tmp = currNode->next;
currNode->next =tmp->next;
currNode = tmp;
}
return pCloneHead;
}
};
20.题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
stack<TreeNode*> stack;
TreeNode*root=NULL; TreeNode *p = pRootOfTree;
TreeNode *pre=NULL;
bool isFirst=true;
//栈不空或者p不空时循环
while (p || !stack.empty()){
while (p != NULL){
//存入栈中
stack.push(p);
//遍历左子树
p = p->left;
}
p = stack.top();
stack.pop();
if(isFirst){
root=p;
pre = root;
isFirst=false;
}else
{
pre->right = p;
p->left = pre;
pre = p;
}
p = p->right;
}//while
return root;
}
};
递归
//直接用中序遍历
public class Solution {
TreeNode head = null;
TreeNode realHead = null;
public TreeNode Convert(TreeNode pRootOfTree) {
ConvertSub(pRootOfTree);
return realHead;
} private void ConvertSub(TreeNode pRootOfTree) {
if(pRootOfTree==null) return;
ConvertSub(pRootOfTree.left);
if (head == null) {
head = pRootOfTree;
realHead = pRootOfTree;
} else {
head.right = pRootOfTree;
pRootOfTree.left = head;
head = pRootOfTree;
}
ConvertSub(pRootOfTree.right);
}
}
剑桥offer(11~20)的更多相关文章
- ⛅剑指 Offer 11. 旋转数组的最小数字
20207.22 LeetCode 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小 ...
- [剑指 Offer 11. 旋转数组的最小数字]
[剑指 Offer 11. 旋转数组的最小数字] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5, ...
- java实现《剑指offer》(二)11~20 更新中
11.二进制中1的个数 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. (1)最优解 public class Solution { public int NumberOf1(int ...
- 原生JavaScript技巧大收集(11~20)-(终于又被我找到这篇文章了)
11.原生JavaScript加入收藏夹 function AddFavorite(sURL, sTitle) { try { window.external.addFavorite(sURL, sT ...
- 20道C#练习题(二)11——20题
11.一个游戏,前20关是每一关自身的分数,1-30关每一关是10分,31-40关,每一关是20分,1-49关,每一关是30分,第50关是100分,输入你现在闯到的关卡数,求你现在拥有的分数.利用if ...
- 【Java】 剑指offer(11) 矩阵中的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...
- 剑指offer(20)包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...
- 剑桥offer(31~40)
31.题目描述 统计一个数字在排序数组中出现的次数. 思路:找到最低和最高,相减 class Solution { public: int GetNumberOfK(vector<int> ...
- 软件工程项目组Z.XML会议记录 2013/11/20
软件工程项目组Z.XML会议记录 [例会时间]2013年11月20日星期三21:00-22:00 [例会形式]小组讨论 [例会地点]学生公寓3号楼会客厅 [例会主持]李孟 [会议记录]李孟 会议整体流 ...
随机推荐
- 为什么说session依赖cookie,以及cookie的常用知识
session的用法 session在Flask中通常用做设置某些页面的权限,比如某些页面必须要登录才可以看到,登录的信息或标志就放到session中.它的使用过程如下: 在整个flask工程的启动文 ...
- 【转】unity3d 资源文件从MAX或者MAYA中导出的注意事项
转自游戏开发主席 1.首先,Unity3d 中,导出带动画的资源有2种导出方式可以选择: 1) 导出资源时,只导出一个文件,保留模型,骨骼和所有的动作帧(把所有的动作,比如idle,atta ...
- 凸包算法(Graham扫描法)详解
先说下基础知识,不然不好理解后面的东西 两向量的X乘p1(x1,y1),p2(x2,y2) p1Xp2如果小于零则说明 p1在p2的逆时针方向 如果大于零则说明 p1在p2的顺时针方向 struct ...
- 告别加载dll 出错开机加载项大揭秘
提到开机加载(load)项,大家不要以为就是系统启动(run)项.最简单的例子是,杀毒软件或者用户手动删除病毒文件后,注册表中的自动加载信息仍在,登陆系统时就会提示"加载*dll出错,系统找 ...
- How Does Batch Normalization Help Optimization?
1. 摘要 BN 是一个广泛应用的用于快速稳定地训练深度神经网络的技术,但是我们对其有效性的真正原因仍然所知甚少. 输入分布的稳定性和 BN 的成功之间关系很小,BN 对训练过程更根本的影响是:它让优 ...
- 最全NB-IoT/eMTC物联网解决方案名录汇总
NB-IoT/eMTC等蜂窝物联网技术的成熟和商用,占据低功耗广域网络(LPWAN)的主流地位,推动全球物联网新一轮发展热潮,越来越多的行业开始采用物联网方案来解决解决实际问题.实现落地应用,越来越多 ...
- 二叉树及其遍历方法---python实现
github:代码实现 本文算法均使用python3实现 1. 二叉树 1.1 二叉树的定义 二叉树是一种特殊的树,它具有以下特点: (1)树中每个节点最多只能有两棵树,即每个节点的度最多为2 ...
- TCP系列12—重传—2、Linux超时重传引入示例
在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例.首先简单的描述一下测试过程 1.设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功 ...
- MVC4 DropDownList (二) — 省市联动
1.添加省份和城市类 //省份 public class Province { public int Id { get; set; } public string Name { get; set; } ...
- 原生javascript自定义input[type=radio]效果
2018年6月27日 更新 找到最为简单的仅仅使用css3的方案 <!DOCTYPE html> <html lang="en"> <head> ...