剑指offer第六章
剑指offer第六章
1.数字在排序数组中出现的次数
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k)
{
int count=;
for(int i=;i<data.size();i++)
{
if(data[i]==k)
count++;
}
return count;
}
};
class Solution {
/*二分查找 找到第一个K 和 最后一个K 二者位置相减*/
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())
return ;
int number = ;
int first = GetFirstIndex(data,k,,data.size()-);
int last = GetLastIndex(data,k,,data.size()-);
if(first>- && last>-)
number = last - first +;
return number;
}
int GetFirstIndex(vector<int> &data,int k,int start,int end){
if(start > end)
return -;
int mid = start+(end-start)/;
if(data[mid] == k){
if((mid == start) || (data[mid-] != k))
return mid;
else
end = mid-;
}
else{
if(data[mid] > k)
end = mid - ;
else
start = mid + ;
}
return GetFirstIndex(data,k,start,end);
}
int GetLastIndex(vector<int> &data,int k,int start,int end){
if(start > end)
return -;
int mid = start+(end-start)/;
if(data[mid]==k){
if((mid == end) || (data[mid+] != k))
return mid;
else
start = mid +;
}
else{
if(data[mid]>k)
end = mid-;
else
start = mid+;
}
return GetLastIndex(data,k,start,end);
}
};
2.二叉树的深度
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
if(pRoot==NULL)
return ;
int nLeft=TreeDepth(pRoot->left);
int nRight=TreeDepth(pRoot->right);
int depth=;
if(nLeft>nRight)
depth=nLeft+;
else
depth=nRight+;
return depth;
}
};
3.平衡二叉树
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot)
{
if(pRoot==NULL)
return true;
int left=TreeDepth(pRoot->left);
int right=TreeDepth(pRoot->right);
int diff=left-right;
if(diff>||diff<-)
return false;
return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
}
int TreeDepth(TreeNode* pRoot)
{
if(pRoot==NULL)
return ;
int nLeft=TreeDepth(pRoot->left);
int nRight=TreeDepth(pRoot->right);
int depth=;
if(nLeft>nRight)
depth=nLeft+;
else
depth=nRight+;
return depth;
}
};
4.数组中只出现一次的数字
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
{
int length=data.size();
if(length<)
return;
if(length==)
{
num1[] = data[];
num2[] = data[];
return;
}
int bitResult = ;
for(int i = ; i < length; ++i)
{
bitResult ^= data[i];
}
int index = findFirst1(bitResult);
*num1=*num2=;
for(int i = ; i < length; ++i)
{
if(isBit1(data[i], index))
{
*num1 ^= data[i];
}
else
{
*num2 ^= data[i];
}
}
}
int findFirst1(int num)
{
int index=;
while(((num&)==)&&(index<*sizeof(int)))
{
num=num>>;
++index;
}
return index;
}
bool isBit1(int num,int index)
{
num=num>>index;
return (num&);
}
};
5.和为s的两个数字
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
int length=array.size();
vector<int> res;
int ahead=length-;
int behind=;
while(ahead>behind)
{
long long curSum=array[ahead]+array[behind];
if(curSum==sum)
{
res.push_back(array[behind]);
res.push_back(array[ahead]);
break;
}
else if(curSum>sum)
{
ahead--;
}
else
{
behind++;
}
}
return res;
}
};
6.和为s的连续正数序列
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum)
{
vector<vector<int> > res;
if(sum<)
return res;
int small=;
int big=;
int middle=(+sum)/;
int curSum=small+big;
while(small<middle&&big<sum)
{
while(curSum > sum)
{
curSum -= small;
small++;
}
if(curSum==sum)
{
InsertRes(small,big,res);
}
big++;
curSum+=big;
}
return res;
}
void InsertRes(int small,int big,vector<vector<int> > &res)
{
vector<int> temp;
for(int i = small;i<=big;i++)
temp.push_back(i);
res.push_back(temp);
}
};
7.反转单词序列
class Solution {
public:
string ReverseSentence(string str)
{
ReverseWord(str,,str.size()-);//先整体翻转
int start=,end=;
int i=;
int length=str.size();
while(i<length)
{
while(i<length&&str[i]==' ')//空格跳过
{
i++;
}
start=end=i;
while(i<length&&str[i]!=' ')
{
i++;
end++;
}
ReverseWord(str,start,end-);
}
return str;
}
void ReverseWord(string &str, int start, int end)
{
while(start < end)
{
swap(str[start++], str[end--]);
}
}
};
8.左旋转字符串
class Solution {
public:
string LeftRotateString(string str, int n)
{
int length = str.size();
if(length<=)
return str;
if(length>&& n>&&n<length)
{
int firstStart = ;
int firstEnd = n-;
int secondStart = n;
int secondEnd = length-;
Reverse(str,firstStart,firstEnd);
Reverse(str,secondStart,secondEnd);
Reverse(str,firstStart,secondEnd);
}
return str;
}
void Reverse(string &str, int start, int end)
{
while(start < end)
{
swap(str[start++], str[end--]);
}
}
};
9.扑克牌的顺子
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=)
return false;
sort(numbers.begin(),numbers.end());
int i=;
while(numbers[i]==)
i++;
if(numbers[]-numbers[i]>)
return false;
for(int j=i;j<;j++){
if(numbers[j]==numbers[j+])
return false;
}
return true;
}
};
10.圆圈中最后剩下的数字
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<||m<)
return -;
int i=;
list<int> numbers;
for(i=;i<n;++i)
numbers.push_back(i);
list<int>::iterator current=numbers.begin();//开始点
while(numbers.size()>)
{
for(int i=;i<m;++i)
{
current++;//指针后移
if(current==numbers.end())
current=numbers.begin();
}
list<int>::iterator next=++current;
if(next==numbers.end())
next=numbers.begin();
--current;
numbers.erase(current);
current=next;
}
return *(current);
}
};
class Solution {
public:
int LastRemaining_Solution(unsigned int n, unsigned int m)
{
if(n==)
return -;
if(n==)
return ;
else
return (LastRemaining_Solution(n-,m)+m)%n;
}
};
11.求1+2+3+...+n
class Solution {
public:
int Sum_Solution(int n)
{
int sum = n;
sum&&((sum+=Sum_Solution(n-)));
return sum;
}
};
12.不用加减乘除做加法
class Solution {
public:
int Add(int num1, int num2)
{
int sum,carry;
do{
sum=num1^num2;
carry=(num1&num2)<<;
num1=sum;
num2=carry;
}while(num2!=);
return num1;
}
};
剑指offer第六章的更多相关文章
- 剑指offer第七章&第八章
剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 剑指offer第四章
剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...
- 剑指offer第三章
剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...
- 《剑指Offer》第二章(一)题3-8
为春招实习做准备,记录一下<剑指Offer>里面的面试题 第二章 面试题3:数组之中的重复数字. 这个题吧,虽然不难,但是不知道为什么就是看了很久,可能很久没有做算法题了.最后面一句话说的 ...
- 《剑指Offer》第二章(一)题 9 -12
第二章 面试题9:用两个栈实现队列 题目:如面试题,给你两个栈, 实现队列的先进先出,即在队列头删除一个元素以及在队列的尾部添加一个元素 思路:这个题的分析感觉很巧妙,从一个具体的例子入手,找出其中的 ...
- 剑指offer—第三章高质量代码(o(1)时间删除链表节点)
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...
- 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)
题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...
- 剑指offer—第三章高质量代码(数值的整数次方)
高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...
随机推荐
- w3c标准盒模型与IE传统模型的区别
一.盒子模型(box model) 在HTML文档中的每个元素被描绘为矩形盒子.确定其大小,属性——比如颜色.背景.边框,及其位置是渲染引擎的目标. CSS下这些矩形盒子由标准盒模型描述.这个模型描述 ...
- linux五大搜索命令学习
五大搜索命令学习 分别解释locate,find,which,whereis,grep 五大linux搜索命令 locate 解释:由man手册可以看出,locate查找就是根据文件名进行查找,只是依 ...
- HDU 2795 线段树单点更新
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【转】通过blktrace, debugfs分析磁盘IO
前几天微博上有同学问我磁盘util达到了100%时程序性能下降的问题,由于信息实在有限,我也没有办法帮太大的忙,这篇blog只是想给他列一下在磁盘util很高的时候如何通过blktrace+debug ...
- js Math对象的常用方法
1,基本方法: Math.round();向上四舍五入. Math.ceil();向上取整,有小数就整数部分加1 Math.floor(5/2) ;向下取整 Math.abs();返回绝对值: Mat ...
- Python3 学习第十三弹: 模块学习五之pickle与json
对于python来说,这两个模块是十分实用的两个模块,以一种简单的方法用于储存数据实例. pickle模块 提供用来储存Python各种数据序列化存储 # 原来的cPickle已经在python3中与 ...
- Python 序列化pickle/cPickle模块整理
Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人.你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁.很多游戏允许你在退出的时候保存进度,然后你再 ...
- CentOS 6.5 升级内核到 3.10.28
本文适用于CentOS 6.4, CentOS 6.5,亲测可行,估计也适用于其他Linux发行版. 1. 准备工作 1.1 下载源码包 Linux内核版本有两种:稳定版和开发版 ,Linux内核版本 ...
- kvm虚拟主机安装速度很慢
在c6220 II上部署虚拟化遇到的问题: 1.部署完kvm后,安装虚拟主机的过程非常缓慢,但是最终能成功 原因:宿主机BIOS的virtualization technology设置为Disable ...
- nodejs编译sass模块包 node-compass,与gulp包gulp-sass使用方法
简介:node express或者就是node项目中,要自动编译sass方法很多,比如gulp 比如考拉,比如今天我想说的这个包node-compass. 编译sass的三种方法: 前提条件: 都需要 ...