剑指offer例题分享--8

简介:   前言:继续分享,加油!  面试题44:    代码如下:#include#includeusing namespace std;int compare(const void *arg1,const void *arg2){ return *(int *)arg1 - ...

  前言:继续分享,加油!

  面试题44:

  

  代码如下:

#include<iostream>
#include<stdlib.h>
using namespace std;

int compare(const void *arg1,const void *arg2)
{
    return *(int *)arg1 - *(int *)arg2;
}

bool IsContinuous(int *numbers,int len)
{
    if(numbers==NULL || len<1)
        return false;

    qsort(numbers,len,sizeof(int),compare);

    int    numberOfZero = 0;
    int numberOfGap = 0;

    //统计数组中的间隔数目
    int small = numberOfZero;
    int big = small+1;
    while(big < len)
    {
        //两个数相等,有对子,不可能是顺子
        if(numbers[small] == numbers[big])
            return false;

        numberOfGap += numbers[big]-numbers[small]-1;
        small = big;
        ++big;
    }

    return (numberOfGap>numberOfZero)?false:true;
}

int main()
{
    int data[]={1,2,3,4,9};
    cout << boolalpha << IsContinuous(data,5) << endl;
    
    return 0; 
}

  面试题45:

  

  代码如下:

  

#include<iostream>
#include<list>
using namespace std;

int LastRemaining(unsigned int n,unsigned int m)
{
    if(n<1 || m<1)
        return -1;

    unsigned int i=0;

    //创建双向链表
    list<int> numbers;
    for(i=0;i<n;++i)
        numbers.push_back(i);
    //使用迭代器
    list<int>::iterator current = numbers.begin();
    while(numbers.size() > 1)
    {
        //找到m位置
        for(int i=1;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);
}

int main()
{
    cout << "data: " << LastRemaining(5,3) << endl;
    
    return 0;
}

  面试题46:

  

  这道题用是三种方法给大家演示:

  方法一:构造函数

  

/* 解法一:利用构造函数 */

#include<iostream>
using namespace std;

class Temp{
    private:
        static unsigned int N;
        static unsigned int Sum;
    public:
        //构造函数
        Temp(){++N;Sum+=N;};
        static void Reset(){N=0;Sum=0;}
        static unsigned int GetSum(){return Sum;}
};

unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;

unsigned int Sum_Solution(unsigned int n)
{
    Temp::Reset();

    //会调用n次
    Temp *a = new Temp[n];
    delete []a;
    a=NULL;

    return Temp::GetSum();
}

int main()
{    
    cout << "sum: " << Sum_Solution(100) << endl;;

    return 0;
}

  方法二:虚函数

  

/* 解法二 用虚函数  */

#include<iostream>
using namespace std;

class A;
A*Array[2];

class A{
    public:
        virtual unsigned int Sum(unsigned int n)
        {
            return 0;
        }
};

class B:public A
{
    public:
        virtual unsigned int Sum(unsigned int n)
        {
            //两次取反,非0的n转换为true
            return Array[!!n]->Sum(n-1) + n;
        }
};

int Sum_Solution(int n){
    A a;
    B b;
    Array[0] = &a;
    Array[1] = &b;

    int value = Array[1]->Sum(n);

    return value;
}

int main()
{
    cout << "sum: " << Sum_Solution(3) << endl;

    return 0;
}

  方法三:利用函数指针

  

/* 利用函数指针 */

#include<iostream>
using namespace std;

typedef unsigned int (*fun)(unsigned int);

unsigned int Solution_T(unsigned int n)
{
    return 0;
}

unsigned int Sum_Solution(unsigned int n)
{
    static fun f[2] = {Solution_T,Sum_Solution};
    return n + f[!!n](n-1);
}

int main()
{
    cout << "sum: " << Sum_Solution(100) << endl;

    return 0;
}

  面试题47:

  

  代码如下:

  

#include<iostream>
using namespace std;

int Add(int num1,int num2)
{
    int sum,carry;
    do{
        //两个数先求异或,相同为0,相反为1
        sum = num1 ^ num2;
        //相与然后左移一位
        carry = (num1&num2)<<1;

        num1 = sum;
        num2 = carry;
    }while(num2 != 0);

    return num1;
}

int main()
{
    cout << "num: " << Add(1,2) << endl;

    return 0;
}

  总结:经过很长一段时间才把这本书看完并码代码,收获很多,数据结构和算法之路才刚刚开始,学习之路还很长,希望对各位能有所帮助。继续加油...,梦想还是要用有的,万一见鬼了呢!

 

作者: 柳德维

-------------------------------------------

个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ⁾⁾!

目录
相关文章
|
Kubernetes 算法 API
K8S 二进制部署-1
K8S 二进制部署
200 0
|
前端开发 NoSQL Java
毕业设计|springboot+h5的购物商城系统(一)
毕业设计|springboot+h5的购物商城系统
312 2
|
缓存 数据库 索引
实时数仓 Hologres产品使用合集之需要定期更新一张线上频繁查询的表,该如何操作
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
存储 关系型数据库 MySQL
Mysql的索引类型及其实现方式
Mysql的索引类型包括B-Tree索引和哈希索引,其中B-Tree索引是最常见的索引类型,而哈希索引则仅适用于某些特殊场景
|
缓存 负载均衡 算法
一文带你领略并发编程的内功心法
本篇文章我们来探讨一下并发设计模型。 可以使用不同的并发模型来实现并发系统,并发模型说的是系统中的线程如何协作完成并发任务。不同的并发模型以不同的方式拆分任务,线程可以以不同的方式进行通信和协作。
128 0
一文带你领略并发编程的内功心法
|
移动开发 前端开发 网络协议
【go,聊天室】认识 WebSocket
【go,聊天室】认识 WebSocket
674 0
【go,聊天室】认识 WebSocket
|
运维 Cloud Native Dubbo
Service Mesh 在超大规模场景下的落地挑战
随着微服务软件架构在互联网企业的广泛实践,新一代微服务软件架构技术悄然兴起,Service Mesh 便是其中之一。阿里巴巴高级技术专家至简在 KubeCon 2020 阿里巴巴云原生专场分享了《Service Mesh 在超大规模场景下的落地挑战》,基于阿里巴巴的落地实践,分享一些经验和思路。本文是部分内容整理。
Service Mesh 在超大规模场景下的落地挑战
|
SQL druid Java
【直播预告】:Java Spring Boot开发实战系列课程【第14讲】:Spring Boot 2.0实战MyBatis连接池阿里Druid与SQL性能监控
阿里开源数据库连接池组件Druid非常强大,,本次课程一起学习如何在最新的Java Spring Boot 2.0和MyBatis系统 中集成阿里开源的连接池Druid,以及SQL性能监控,生产环境必备利器。
66561 0
|
传感器 机器学习/深度学习 人工智能
2020年,如何选择更合适的工业物联网应用
据估计,到2026年,工业物联网市场的规模将超过7700亿美元。这意味着大约有220亿台工业物联网设备连接到互联网,而2018年只有70亿台。此外,工业物联网设备的类型和范围还在不断扩大。新一代的智能传感器、物联网软件和工业物联网平台正在出现。
1356 0