剑指offer第二章
剑指offer第二章
1.二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
- class Solution {
- public:
- bool Find(int target, vector<vector<int> > array)
- {
- /*二维数组的行数和列数*/
- int rows = array.size();
- int columns = array[].size();
- int row;
- int column;
- for (row = rows - , column = ; row >= && column<columns;)
- {
- if (target == array[row][column])
- return true;
- if (target<array[row][column])
- {
- row--;
- continue;
- }
- if (target>array[row][column])
- {
- column++;
- continue;
- }
- }
- return false;
- }
- };
2.替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- class Solution {
- public:
- void replaceSpace(char *str,int length)
- {
- if(str==NULL||length<)
- {
- return;
- }
- int originalLength=;
- int numberOfBlank=;
- int i=;
- while(str[i]!='\0')//计算原始字符串长度和空格数目
- {
- ++originalLength;
- if(str[i]==' ')
- {
- ++numberOfBlank;
- }
- ++i;
- }
- int newLength=originalLength+numberOfBlank*;//替换之后新的长度
- if(newLength>length)
- //溢出、越界
- return;
- int indexOfOriginal=originalLength;
- int indexOfNew=newLength;
- while(indexOfOriginal>=&&indexOfNew>indexOfOriginal)
- {
- if(str[indexOfOriginal]==' ')//找到空格,依次插入‘0’‘2’‘%’
- {
- str[indexOfNew--]='';
- str[indexOfNew--]='';
- str[indexOfNew--]='%';
- }
- else
- {
- str[indexOfNew--]=str[indexOfOriginal];
- }
- --indexOfOriginal;
- }
- }
- };
3.从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值。
- //struct ListNode {
- //int val;
- //struct ListNode *next;
- //ListNode(int x) :
- //val(x), next(NULL) {
- //}
- //};
- class Solution{
- public:
- vector<int> printListFromTailToHead(struct ListNode* head){
- vector<int> result;
- struct ListNode* pNode=head;
- while(pNode!=NULL){
- result.push_back(pNode->val);
- pNode=pNode->next;
- }
- reverse(result.begin(),result.end());//applying reverse()
- return result;
- }
- };
4.重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
- /**
- * Definition for binary tree
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- * };
- */
- class Solution {
- public:
- struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
- {
- //判定递归终止条件;
- if(pre.size() == || in.size() == )
- {
- return NULL;
- }
- //定义Node节点并其求根节点;
- int root = pre[];
- TreeNode* node = new TreeNode(root);
- vector<int>::iterator it;
- //1.求左右子树的遍历序列;
- vector<int> preLeft, preRight, inLeft, inRight;
- //(1).求根节点在中序遍历序列中的位置;
- vector<int>::iterator i;
- for(it = in.begin(); it != in.end(); it++)
- {
- if(root == *it)
- {
- i = it;
- }
- }
- //(2).求左右子树的中序遍历子序列;
- int k = ;
- for(it = in.begin(); it != in.end(); it++)
- {
- if(k == )
- {
- inLeft.push_back(*it);
- }
- else if(k == )
- {
- inRight.push_back(*it);
- }
- else {}
- if(it == i)
- {
- k = ;
- }
- }
- //(3).求左右子树的前序遍历子序列;
- k = ;
- vector<int>::iterator ite;
- for(it = pre.begin()+; it != pre.end(); it++)
- {
- for(ite = inLeft.begin(); ite != inLeft.end(); ite++)
- {
- if(*it == *ite)
- {
- preLeft.push_back(*it);
- k = ;
- }
- }
- if(k == )
- {
- preRight.push_back(*it);
- }
- k = ;
- }
- //根据遍历序列求出跟的左右节点;
- node->left = reConstructBinaryTree(preLeft,inLeft);
- node->right = reConstructBinaryTree(preRight,inRight);
- //返回节点地址;
- return node;
- }
- };
5.用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- class Solution
- {
- public:
- void push(int node)
- {
- stack1.push(node);
- }
- int pop()
- {
- int a;
- if(stack2.empty())
- {
- while(!stack1.empty())
- {
- a=stack1.top();
- stack2.push(a);
- stack1.pop();
- }
- }
- a=stack2.top();
- stack2.pop();
- return a;
- }
- private:
- stack<int> stack1;
- stack<int> stack2;
- };
6.旋转数组的最小数字
- class Solution {
- public:
- int minNumberInRotateArray(vector<int> rotateArray)
- {
- //数组为空时
- if(rotateArray.size() == )
- return -;
- //前部分数据旋转
- for(int i = ; i < rotateArray.size() - ; i++)
- {
- if (rotateArray[i] > rotateArray[i + ])
- return rotateArray[i + ];
- }
- //全部数据旋转,相当于没有旋转,最小数即为第一个数
- return rotateArray[];
- }
- };
7.菲波那切数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
- class Solution {
- public:
- int Fibonacci(int n)
- {
- int result[]={,};
- if(n<)
- return result[n];
- long long f1=;
- long long f2=;
- long long fn=;
- for(int i=;i<=n;i++)
- {
- fn=f1+f2;
- f2=f1;
- f1=fn;
- }
- return fn;
- }
- };
8.二进制中”1“的个数
- class Solution {
- public:
- int NumberOf1(int n)
- {
- int count=;//统计的值初始化
- unsigned int flag=;//设置一个标志,作为循环结束的终止条件
- while(flag)
- {
- //首先把n和1做与运算,判断n的最低位是不是为1
- //接着把1左移一位得到2,在与n做与运算,就能判断n的次低位是不是1
- //......这样反复左移,每次都能判断n的其中一位是不是1。
- // 循环的次数等于整数二进制的位数
- if(n&flag)
- count++;
- flag=flag<<;
- }
- return count;
- }
- };
剑指offer第二章的更多相关文章
- 剑指offer—第二章算法之二分查找(旋转数组的最小值)
旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...
- 剑指offer—第二章算法之快速排序
算法:排序和查找(二分查找,归并排序,快速排序),位运算等. 查找:顺序查找,哈希查找,二叉排序树查找,哈希表. 二分查找可以解决:"旋转数组中的最小数字","数字在排序 ...
- 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...
- 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...
- 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表
具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...
- 《剑指offer 第二版》题解
剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...
- 《剑指offer(第二版)》面试题60——n个骰子的点数
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...
- 《剑指offer(第二版)》面试题64——求1+2+...+n
一.题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句 (即三元运算符,A? B : C) 二.题解 虽然求和问 ...
- 结合《剑指offer(第二版)》面试题51来谈谈归并排序
一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6 ...
随机推荐
- javascript 关于节点
重复使用对像可以用 var a,b; with(document){ a = getElementById('aID') b = getElementById('bID') } 关于节点访问: par ...
- centos添加php及mysql环境变量
在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行 “php -v”命令查看当前php版本信息时时 ...
- 输入T,返回TResult的委托
下面的 委托 兼容输入 参数T,并且 返回值类型为TResult 的 方法(即封装一个具有一个参数并返回TResult 参数指定的类型值的方法) public delegate TResult Fun ...
- nyoj164——卡特兰数(待填坑)
题意:将1~2n个数按照顺时针排列好,用一条线将两个数字连接起来要求:线之间不能有交点,同一个点只允许被连一次. 最后问给出一个n,有多少种方式满足条件. 卡特兰数(列): 令h(0)=1,h(1)= ...
- SPOJ 694 && SPOJ 705 (不重复子串个数:后缀数组)
题意 给定一个字符串,求它的所有不重复子串的个数 思路 一个字符串的子串都必然是它的某个后缀的前缀.对于每一个sa[i]后缀,它的起始位置sa[i],那么它最多能得到该后缀长度个子串(n-sa[i]个 ...
- Ansible 小手册系列 十三(Jinja2)
用于playbook中的jinja 2过滤器 更改数据格式,其结果是字符串 {{ some_variable | to_json }} {{ some_variable | to_yaml }} 对于 ...
- hdu 5802 Windows 10 (dfs)
Windows 10 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- wget 认知及常用命令【转载】
https://www.cnblogs.com/lxz88/p/6278268.html https://www.cnblogs.com/cindy-cindy/p/6847502.html
- Android SDK无法更新解决办法
一.设置SDK代理 启动Android SDK Manager,选择菜单 Tools ->Options -> 代理地址: mirrors.opencas.cn 代理端口: 80 如下图: ...
- linux和windows双系统设置默认启动系统
1.以root身份登录linux系统: 2.启动终端,输入命令:vi /boot/grub/grub.conf,文件内容如下: #boot=/dev/sda default=0 (默认启动哪个系统的设 ...