剑指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—第三章高质量代码(数值的整数次方)
高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...
随机推荐
- ADO.net笔记
1.DbConnectionConnection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接.所有Connection对象的基类都是DbConnection类.Conn ...
- 仿照Chome的GhostPage调试功能
今天在测试过程中发现了网站的一个bug,在大屏幕上是自适应的,小屏幕笔记本上高度不是自适应,html的高度并不是浏览器的高度,小屏幕总是差了一截,在调试过程中偶然发现差的那一小截正好是一个横向滑动条的 ...
- 【Python】模块学习之(__call__)实现准确计算函数运行时间
背景 博主在写自动化的过程中,有遇到有的用例运行缓慢的问题,想起在上一家公司的的“自动化工厂”有一个指标:两小时内运行完所有的用例才算合格.所以想计算每一个用例的运行时间. 思路 因为使用的POM模型 ...
- poi 取excel单元格内容时,需要判断单元格的类型,才能正确取出
以下内容非原创,原文链接http://blog.sina.com.cn/s/blog_4b5bc01101015iuq.html ate String getCellValue(HSSFCell ce ...
- Java的 final 关键字
本文主要探讨Java final 关键字修饰变量时的用法. !!!!文末有彩蛋!!!! 1.修饰类 当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用 ...
- keras运行gan的几个bug解决
http://blog.csdn.net/u012317000/article/details/79211274 https://www.jianshu.com/p/5b1f7004144d
- Python读取指定文件夹(包括当前目录、子目录、子文件)
http://blog.csdn.net/lsq2902101015/article/details/51305825
- 关于.net4.0中的Action委托
在使用委托时,若封装的方法无返回值,并且参数在0-7个,可考虑使用.Net4.0中的Action委托,建议使用系统自带的,减少自定义 public delegate void Action<in ...
- Java中如何获取多维数组的长度
在程序处理中遍历数组是一种很常见的操作,但遍历数组时,我们需要知道数组各维度的长度(一维数组除外,for each 可以遍历),下面举例说明如何求多维数组的长度. 一维 : int [] array ...
- JQuery数字类型验证正则表达式
有朋友整了一些关于js与jquery的数字类型验证正则表达式代码,下面我给大家再整理一下. 这里包括了数字验证实现与测试实例了,大家可参考. js验证数字正则表达式 代码如下: //检测是否为数字和小 ...