小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Programming language
  4. Algorithm
  5. 剑指offer
  6. 正文

《剑指Offer》题目解析(11)

2019年3月8日 1491点热度 0人点赞 0条评论

题目4 和为S的两个数字

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

题目解析

我们知道,两个数字,距离越远,乘积越小,距离越近乘积越大。所以我们可以设置两个指针,一个指向开头,一个指向末尾,然后他们不断移动,同时相加看是不是等于所制定的值。移动的条件是:

  1. 若和大于指定值,则将右指针左移;
  2. 若和小于指定值,则将左指针右移;
  3. 若到最后左指针和有指针位于一个位置,那么直接返回。

代码

    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        int length = array.size();
        int start=0;
        int end=length-1;
        vector<int> result;
        while(start<end)
        {
            if(array[start]+array[end]==sum)
            {
                result.push_back(array[start]);
                result.push_back(array[end]);
                break;
            }
            else if(array[start]+array[end]<sum)
                ++start;
            else
                --end;
        }
        return result;
    }

题目5 左旋转字符串

题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

题目解析

这里我们可以使用一个C++里面的函数:

string substr (size_t pos = 0, size_t len = npos) const;

解释如下:
- pos:要复制的第一个字符作为子字符串的位置。 如果这等于字符串长度,则该函数返回一个空字符串;如果这大于字符串长度,则抛出out_of_range。
- len:要包含在子字符串中的字符数。若为npos,代表所有的字符。

该函数返回一个string类型的对象。

 string& erase (size_t pos = 0, size_t len = npos);

这个函数的意思是:删除从字符位置pos开始并跨越len个字符的字符串值的部分。

所以我们可以考虑利用substr将所要移动的字符复制出来,放到一个临时的字符串中,然后用erase将这几个字母从原字符串中删除,再将临时字符串加到原来字符串的后面即可。

当然一定不要忘记考虑n若为0或者小于零怎么办。

代码

    string LeftRotateString(string str, int n) {
        if(n<0)
            return NULL;
        if(n==0)
            return str;
        string temp=str.substr(0,n);
        str.erase(0,n);
        str+=temp;
        return str;
    }

题目6 不用加减乘除做加法

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

题目解析

这个题目就是让我们思考加法的原理。
首先看十进制是如何做的: 5+7=12,三步走
第一步:相加各位的值,不算进位,得到2。
第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。
第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。
同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111
第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。
第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。
第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。
继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。

代码

 public int Add(int num1,int num2) {
        while(num2!=0){
            int temp = num1^num2;
            num2 = (num1&num2)<<1;
            num1 = temp;
        }
        return num1;
    }

题目7 二叉树的下一个结点

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

题目解析

三种情况:

  1. 是该点若有右子树,则继续往右子树中序遍历;
  2. 是该点无右子树,且是父节点的左孩子,则下一节点就是其父节点;
  3. 是该点无右子树,且是父节点的右孩子,则寻找其父节点的父节点的父节点的……,直到当前节点是寻找到的那个点的左孩子为止。

所以总体来说是四种情况(除以上三种,还有二叉树为空的情况)

代码

    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        //空二叉树
        if (pNode == NULL)
            return NULL;
        //第一种情况
        if(pNode->right!=NULL)
        {
            pNode=pNode->right;
            while(pNode->left!=NULL)
                pNode=pNode->left;
            return pNode;
        }
        //第二三种情况本质上是可以合并的,就是寻找当前节点是寻找到的那个点的左孩子
        while(pNode->next!=NULL)
        {
            TreeLinkNode *paren = pNode->next;
            if(paren->left==pNode)
                return paren;
            pNode=pNode->next;
        }
        //最后一个节点的情况
        return NULL;
    }
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 剑指offer
最后更新:2019年3月8日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
Maintenance Mode:把博客设置为维护状态 C++面向对象程序设计课程笔记(第五周) 谈谈肥猪流【即“非主流】【转载】 第二届中国国际航空体育节相关情况 今天我生日咯!!! Java语言程序设计【学堂在线】编程作业(第三章)
标签聚合
鸟哥的linux私房菜 算法 Java python学习 生活 linux leetcode 高中 Python 学习
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号