剑指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—第三章高质量代码(数值的整数次方)
高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...
随机推荐
- brew 与 nvm
brew 与 nvm 是两个管理软件工具 今天更新了brew结果brew下安装的软件都找不着了.得重新安装,据说brew已经不再更新了.应该是通过github的吧. 结果得重装node与npm,这两 ...
- C# SQLite写入和读取DateTime类型
很简单 1.不要相信网上大部分人说的话,比如存到int里 (ps:版本差距知道吗?) 2.nuget包下载最新版的sqlite 3.SQLite支持DateTime类型(图形化工具不会给提示无视它), ...
- 设计模式--备忘录模式C++实现
备忘录模式C++实现 1定义Memento pattern 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先的状态 2类图 3实现 clas ...
- 虚拟机VMware搭建代码环境
安装git yum install git -y 安装nvm curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/ins ...
- zabbix selinux audit2allow 问题
he following example demonstrates using audit2allow to create a policy module: A denial and the asso ...
- angularJS----filter
angularJS过滤器 过滤器(filter)正如其名,作用就是接收一个输入(隐式的接收数据源),通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组 ...
- jps、jstack、jmap、jhat、jstat、hprof使用详解
https://my.oschina.net/feichexia/blog/196575#comment-list A. jps(Java Virtual Machine Process Status ...
- 重温ASP.NET WebAPI(二)进阶
重温ASP.NET WebAPI(二)进阶 介绍 本文为个人对WebApi的回顾无参考价值. 本文内容: Rest和UnitOfWork 创建WebAPi的流程 IOC-Unity的使用 MEF ...
- 2: 使用Prism初始化程序(纯汉语版)
本篇内容讲解了Prism应用程序启动和运行都发生了什么.一个Pris应用程序在程序启动期间需要注册和配置——这被叫做引导应用程序.Prism引导过程包括创建和配置一个模块目录,创建一个例如Unity的 ...
- 淘宝TDDL配置以及使用
此章节具体介绍一下淘宝TDDL具体配置和使用 1. Spring配置文件配置:================spring-mybatis.xml 中配置============= <bean ...