编程之旅-Day9

本文详述了编程面试中的算法和数据结构问题,包括剑指Offer的剪绳子和反转链表,LeetCode的糖果分配和二叉树后序遍历,2017年校招真题的排序方法,以及动态链接库和哈夫曼树的相关知识,旨在提升编程面试的准备水平。
摘要由CSDN通过智能技术生成

目录

Day9-学习内容:

1.剑指Offer

面试题14:剪绳子

面试题24:反转链表

2.Leetcode

例1:给n个孩子分糖果,满足下列条件时求最少分发的糖果数。

例2:求二叉树的后序遍历。

3.2017年校招真题

例1:两种排序方法

4.校招真题-单选题

例1.下面哪一个不是动态链接库的优点

例2:n个数值选出最大m个数

例3:由权值分别为1、12、13、4、8的叶子节点生成一颗哈夫曼树,它的带权路径长度为


 

1.剑指Offer

面试题14:剪绳子

牛客网暂无对应练习题

 

面试题24:反转链表

题目描述:

输入一个链表,反转链表后,输出新链表的表头。

思路:1.需要使用三个指针用于保存当前节点、当前节点的前一个节点、当前节点的后一个节点(防止链表断裂)

            2.可借助图形帮助分析,反转链表的头节点为原来链表的尾节点

            3.需要考虑输入链表头指针为nullptr、只有一个节点、有多个节点等情况,注意代码的鲁棒性,方法是提前想好测试用例,利用测试用例对代码进行检查。

代码:

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* ReverseHead=nullptr;
        ListNode* pNode=pHead;
        ListNode* pPre=nullptr;
        while(pNode!=nullptr){
            ListNode* pNext=pNode->next;
            if(pNext==nullptr){
                ReverseHead=pNode;
            }
            pNode->next=pPre;
            pPre=pNode;
            pNode=pNext;
        }
        return ReverseHead;
    }
};

2.Leetcode

例1:给n个孩子分糖果,满足下列条件时求最少分发的糖果数。

题目描述:

There are N children standing in a line. Each child is assigned a rating value. 

You are giving candies to these children subjected to the following requirements: 

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

思路:动态规划,因为是求最优问题且该问题能被分解成若干重复的子问题。

代码:

class Solution {
public:
    int candy(vector<int> &ratings) {
        int len=ratings.size();
        if(len==1) return 1;   //只有一个孩子
        
        vector<int> v(len,1);    //每个孩子先分一个糖果
        int sum=0;
        for(int i=1;i<len;i++){     //从左向右扫描,保证一个方向上ratings值越大分得的糖果越多
            if(ratings[i]>ratings[i-1]){
                v[i]=v[i-1]+1;
            }
        }
        for(int i=len-2;i>=0;i--){    //从右向左扫描,保证该方向上ratings值越大分得的糖果越多
            i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值