剑指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—第三章高质量代码(数值的整数次方)
		高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ... 
随机推荐
- hibernate:inverse、cascade,一对多、多对多详解
			1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所 ... 
- mysql 不同条件count ,多条件count()
			create table abc(A int,B int) Select A,count(B) as total from ABC group by A Select A,count(B) as to ... 
- 设计模式--原型模式C++实现
			原型模式C++实现 1定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 2类图 3实现 class Prototype { protected: Prototype(); publ ... 
- 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger
			1. 倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join ... 
- 1-19-1 RHEL6启动原理和故障排除
			大纲: 一.RHEL6系统启动原理 BIOS--->mbr--->bootloader--->内核--->init--->/etc/rc.d/rc.sysinit---& ... 
- yii2的定时任务
			php yii minsheng-cancel-account/cancel-applied-account 
- IOS UI-键盘处理和UIToolbar
			// // ViewController.m // IOS_0225-键盘处理和UIToolBar // // Created by ma c on 16/2/25. // Copyright © 2 ... 
- mysql数据库基础知识和认识
			mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ... 
- 【河南省第十一届ACM大学生程序设计竞赛-D】.求XF+闭包
			如何设计一个好的数据库不仅仅是一个理论研究问题,也是一个实际应用问题.在关系数据库中不满足规范化理论的数据库设计会存在冗余.插入异常.删除异常等现象. 设R(U)是一个关系模式,U={ A1,A ... 
- 【Seajs源码分析】1. 整体架构
			seajs是一个非常流行的模块开发引擎,目前项目中使用比较多,为了深入了解已经改进seajs我阅读了他的源码,希望对自己的代码生涯能有所启发. 本文说介绍的是指seajs2.3.3版本. 首先seaj ... 
