牛客剑指offer 1~10题解

    每道题目能满足要求运行完所有测试例子,但并不追求最优解,只供参考,不解之处可以留言一起交流,共勉,加油!

1.二维数组中的查找

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0 || array[0].size() == 0)
            return false;
        int Count = array[0].size();
        for(int i =0;i<array.size();i++)
        {
            if(array[i][Count-1] > target)
            {
                for(int j = 0;j<Count;j++)
                {
                    if(array[i][j] == target)
                        return true;
                    continue;
                }
            }
            else if(array[i][Count-1] == target)
                return true;
            continue;
        }
        return false;
    }
};

 

2.替换空格

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

class Solution {
public:
    void replaceSpace(char *str,int length) 
    {
        if (str == nullptr)
			return;
        
		int size = strlen(str) + 1;
		int spaceSize = 0;

		for (int i = 0; i<size;i++)
		{
			if (str[i] == ' ')
				spaceSize++;
		}
		if (size+2*spaceSize> length)
			return;

		for (int i = size - 1; i>-1; i--)
		{
			if (str[i] == ' ')
			{
				int len = strlen(str + i) + 1;
				moveTwo(str + i, len);
				str[i] = '%';
				str[i + 1] = '2';
				str[i + 2] = '0';
			}
			else
				continue;
		}
	}
    //内存集体向右移两个字节 并置\0前两个字节
    void moveTwo(char* str,int length)
    {
        for(int i = length-1;i > -1;i--)
        {
            int before = i;
            int after = i+2;
            str[after] = str[before];
        }
        str[0] = str[1] = ' ';
    }
};

 

3.从尾到头打印链表

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        if(!head)
            return vector<int>();
        stack<int> Stack;
        while(head)
        {
            Stack.push(head->val);
            head = head->next;
        }
        vector<int> result;
        int size = Stack.size();
		for (int i = 0; i<size; i++)
		{
			result.push_back(Stack.top());
			Stack.pop();
		}
        return result;
    }
};

 

4.重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
		int kB = 0;
		int kE = pre.size() - 1;
		int k2B = 0;
		int k2E = vin.size() - 1;
		//TreeNode* result = Tree(pre, vin, nullptr,kB, kE, k2B, k2E);
		TreeNode* result = Tree(pre,vin);
		return result;
	}
    TreeNode* Tree(vector<int> pre, vector<int> vin) {
		if (pre.empty() || vin.empty())
			return nullptr;

		TreeNode* root = new TreeNode(pre[0]);

		int pos =  Pos(vin, pre[0]); //pos 不为pre size
		//int leftLen = pos;
		//int rightLen = vin.size() - pos -1;

		vector<int> p1;
		vector<int> v1;
		for (int i = 0; i < pos;i++)
		{
			p1.push_back(pre[i+1]);
			v1.push_back(vin[i]);
		}
		root->left = Tree(p1,v1);
	
		vector<int> p2;
		vector<int> v2;
		for (int i = pos +1; i < vin.size();i++)
		{
			p2.push_back(pre[i]);
			v2.push_back(vin[i]);
		}
		root->right = Tree(p2,v2);
		return root;
	}
    int Pos(vector<int>& pre,int target)
	{
		int result = 0;
		for (auto i = 0; i < pre.size();i++)
		{
			if (target == pre[i])
				return result;
			result++;
		}
		return result;
	}
};

5.用两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        int front = -1;
        while(!stack1.empty())
        {
            int tmp = stack1.top();
            stack1.pop();
            stack2.push(tmp);
        }
       front = stack2.top();
        stack2.pop();
       while(!stack2.empty())
       {
           int tmp = stack2.top();
           stack2.pop();
           stack1.push(tmp);
       }
        return front;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

 

6.旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.empty())
            return 0;
        for(int i =0;i<rotateArray.size()-1;i++)
        {
            if(rotateArray[i] > rotateArray[i+1])
                return rotateArray[i+1];
        }
        return rotateArray[0];
    }
};

 

7.斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

n<=39

class Solution {
public:
    /*
    int Fibonacci(int n) {
        if(n <= 0)
            return 0;
        if(n == 1 || n == 2)
            return 1;
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
    */
    int Fibonacci(int n) {
        if(n <= 0)
            return 0;
        if(n == 1 || n == 2)
            return 1;
        int result = 0;
        int ppre = 1;
        int pre = 1;
        for(int i = 3;i<=n;i++)
        {
            result = ppre+pre;
            ppre = pre;
            pre = result;
        }
        return result;
    }
};

 

8.跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

class Solution {
public:
    int jumpFloor(int number) {
        if(number == 0 || number == 1)
            return 1;
        if(number == 2)
            return 2;
        int result = 0;
        int ppre = 1;
        int pre = 2;
        for(int i = 3;i<=number;++i)
        {
            result = ppre+pre;
            ppre = pre;
            pre = result;
        }
        return result;
    }
};

 

9.变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 0)
            return 1;
        if(number == 1)
            return 1;
        if(number == 2)
            return 2;
        int result = 0;
        for(int i = 0;i<number;i++)
        {
            result += jumpFloorII(number-i-1);
        }
        return result;
    }
};

 

10.矩形覆盖

题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

class Solution {
public:
    int rectCover(int number) {
        if(number == 0)
            return 0;
        if(number==1)
            return 1;
        if(number == 2)
            return 2;
        return rectCover(number-2)+rectCover(number-1);
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值