IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [笔试题]n个孩子最少要分掉多少糖果C/C++ -> 正文阅读

[C++知识库][笔试题]n个孩子最少要分掉多少糖果C/C++

目录

【LeeCode笔试题目】

【错误代码】

【正确思路】


【LeeCode笔试题目】

有n个孩子根据分数来分糖果,要求:

1、每个孩子都至少能分到一个糖果;

2、相邻的孩子,分数高的那一个应该分到比分数低的孩子更多的糖果;

3、若相邻的孩子的分数相同,则不要求多分糖果;

要求计算n个孩子最少要分掉多少糖果?

示例?1:

输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。

原题指路:力扣https://leetcode.cn/problems/candy/

【错误代码】

//arrLen孩子个数
//arr表示arrLen个孩子分数所对应的数组
#include <iostream>
#include "stdio.h"

int solution(int *arr, int arrLen)
{
	int i;
	int candyave[arrLen]; //每个孩子分到的糖果数组
	int candynum=0;  //总共分配的糖果数
	
	//每个孩子分到的糖果基数
	for(i = 0; i < arrLen; i++){
		candyave[i]=1;
	}
	
	//根据分数进行加糖果
	for(i = 0; i < arrLen-1; i++)
	{
		if(arr[i] < arr[i+1]){
			candyave[i+1]=candyave[i]+1;
		}else if(arr[i] > arr[i+1]){
			candyave[i]=candyave[i+1]+1;
		}
	}
	
	//计算总共要多少糖果
	for(i = 0; i < arrLen; i++){
		candynum=candynum+candyave[i];
	}
	
	return candynum;
}

int main()
{
    int arrLen=5;
	int arr[5] = {18,10,8,9,4};
	int num;
	
	num=solution(arr, arrLen);
	printf("least candy number:%d\n",num);
	
	return 0;
}

计算结果是:

least candy number:8

这是昨晚银行在线笔试时候写的代码,根据回忆写了下来,由于当时不能在线调试,只显示不能通过所有测试用例。调试和逻辑对比后发现,上述代码只做到了相邻两个元素之间单次比较,的确错误。

【正确思路】

?借鉴,力扣思路,在错误答案的基础上补全逻辑,如下

int candy(int* ratings, int ratingsSize){

	int i,j;
	int decrease_num=0;
	int candyave[ratingsSize]; //每个孩子分到的糖果数组
	int candynum=0;  //总共分配的糖果数
    int arrLen=ratingsSize;
    int *arr=ratings;
	
	//每个孩子分到的糖果基数
	for(i = 0; i < arrLen; i++){
		candyave[i]=1;
	}
	
	//根据分数进行加糖果
	for(i = 0; i < arrLen-1; i++)
	{
		if(arr[i] < arr[i+1]){
			candyave[i+1]=candyave[i]+1;
			decrease_num=0;
		}else if(arr[i] > arr[i+1]){
			candyave[i]=candyave[i+1]+1;
			decrease_num=decrease_num+1;
			//所有递减序列需要+1
			if(decrease_num != 1 || decrease_num != 0){
				for(j=1;j<decrease_num;j++){
					candyave[j]=candyave[j]+1;
				}
			}
		}else if(arr[i] == arr[i+1] && decrease_num != 0){
			decrease_num=decrease_num+1;
		}else{
			decrease_num=0;
		}
	}
	
	//计算总共要多少糖果
	for(i = 0; i < arrLen; i++){
		candynum=candynum+candyave[i];
	}
	
	return candynum;
}

执行成功:

当然这个答案不是逻辑最优和复杂度最优的,还是向力扣大佬学习,Respect!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:33  更:2022-10-31 11:37:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 5:21:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码