剑指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;
}

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

 

作者: 柳德维

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

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

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

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

目录
相关文章
|
6月前
|
算法
【动态规划专栏】动态规划:卡特兰数---不同的二叉树
【动态规划专栏】动态规划:卡特兰数---不同的二叉树
68 0
|
6月前
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
43 0
|
机器学习/深度学习
【Leetcode】面试题 08.05. 递归乘法、HJ55 挑7
目录 面试题 08.05. 递归乘法 HJ55 挑7
56 0
|
5月前
|
算法 测试技术 程序员
力扣经典150题第二十七题:两数之和 II - 输入有序数组
力扣经典150题第二十七题:两数之和 II - 输入有序数组
27 1
|
5月前
|
算法
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
43 0
|
5月前
|
算法 索引
【洛谷 P1923】【深基9.例4】求第 k 小的数 题解(快速排序)
该题目要求输入一组不超过5000000个奇数个整数,并找出其中第k小的数,不使用`nth_element`函数,而是通过实现快速排序来解决。样例输入为5个数1, 4, 3, 2, 5,k=1,输出第1小的数即最小值2。代码中定义了快速排序函数`quickSort`和划分函数`partition`,并使用`read`函数读取输入。在主函数中对数组进行排序后输出第k个元素。
48 0
|
6月前
|
人工智能 算法 索引
六六力扣刷题贪心算法之K次取反后最大化的数组和
六六力扣刷题贪心算法之K次取反后最大化的数组和
47 0
|
6月前
|
算法
六六力扣刷题数组之有序数组的平方
六六力扣刷题数组之有序数组的平方
45 0
|
算法 C++
【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
【每日算法Day 108】一道简单的二叉树题目,写法还是挺多的。
|
算法 C++
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
109 0