练习题+题解:链表+dp

目录

  • 1.链表指定区间反转
    • 题目描述
    • 输入格式:
    • 输出格式:
    • 输入样例:
    • 输出样例:
    • 题目分析
    • 代码实现
  • 2.hxj和他的甜品盲盒I
    • 输入格式:
    • 输入样例:
    • 输出样例:
      • 样例解释
    • 输入样例:
    • 输出样例:
      • 样例解释
    • 题目分析
    • Java代码实现
  • 3.First 50 Prime Numbers
    • 输入格式
    • 输出格式
    • 输入样例
    • 输出样例
    • 题目解析
    • 代码实现

1.链表指定区间反转

题目描述

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度O(n),空间复杂度O(1)。

输入格式:

输入三行(多组实例测试)
第一行size(表示链表长度,0<size<=1000
第二行输入size个数,为每个节点对应值val(|val|<=1000
第三行为m,n(为反转区间的起止位置,0<m<=n<=size

输出格式:

输出若干行,每行为每次区间反转后的结果

输入样例:

5
1 2 3 4 5
1 3
5
1 2 3 4 5
2 4

输出样例:

3 2 1 4 5
1 4 3 2 5

题目分析

本题要求多组数据输入且每组数据让我们先输入一个size,我们考虑使用scanf("%d", &size) != EOF这样的一个结构来控制循环。
题目思路:首先我们可以先想想整条链表如果要反转应该怎么做,我们可以先创建3个节点指针,n1指向空,n2指向头结点,n3指向n2的下一个节点,然后我们让n2指向n1,让n1到n2位置,n2到n3位置,n3指向n2的下一个节点。以此循环当n2为空时或者循环节点数次时我们结束循环。图片解析如下所示:
在这里插入图片描述

此方法并不唯一,也有其他方法。接下来我们用这个方法来解答指定区间反转问题。
我们可以将n2指向反转区间的头结点,n1继续为空,最后循环次数为(n-m)+1次,n为区间头,m为区间尾。循环结束之后,n1指向区间尾节点,n2指向尾部断开的下一个节点,在通过链接就完成了区间倒转。 图片解析如下所示:
在这里插入图片描述

代码实现

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef struct ListNode {
	int val;
	struct ListNode* next;
}L;//节点
void CreateL(L** phead, int x)//创建链表
{
	L* newNode = (L*)malloc(sizeof(L));
	if (newNode == NULL) {
		perror("malloc fail!");
		return;
	}
	newNode->val = x;
	newNode->next = NULL;
	if (*phead == NULL) {
		*phead = newNode;
		return;
	}
	L* pcur = *phead;
	while (pcur->next) {
		pcur = pcur->next;
	}
	pcur->next = newNode;
}
void PrintL(L* phead)//打印链表
{
	assert(phead);
	L* pcur = phead;
	while (pcur) {
		printf("%d ", pcur->val);
		pcur = pcur->next;
	}
	printf("\n");
}
void InvertL(L** phead,int m,int n)//反转链表
{
	L* n1 = NULL, * n2 = *phead, * n3 = NULL;
	L* pcur = *phead;
	L* phead1 = *phead;//区间开始节点
	for (int i = 1; i < m-1; i++)
	{
		pcur=pcur->next;//区间节点前一个节点
	}
	if(m!=1)phead1 = pcur->next;
	n2 = phead1;//插入区间节点的头结点
	n3 = n2->next;
	for (int i = 0; i <= (n - m); i++) {//指定区间反转循环
		n2->next = n1;
		n1 = n2;
		n2 = n3;
		if(n2!=NULL)n3 = n2->next;//n2不是空,n3才能指向n2的next
	}
	if (m==1) {
		*phead = n1;
		phead1->next = n2;
	}
	else
	{
		pcur->next = n1;
		phead1->next = n2;
	}
}
int main()
{
	int size; 
	while (scanf("%d", &size) != EOF)
	{
		L* plist = NULL;
		for (int i = 0; i < size; i++) {
			int x; scanf("%d", &x);
			CreateL(&plist, x);
		}
		int m, n;
		scanf("%d %d", &m, &n);
		InvertL(&plist, m, n);
		PrintL(plist);
	}
	return 0;
}

2.hxj和他的甜品盲盒I

hxj很爱吃甜品。有一天,他买了一个甜品盲盒,盲盒有x个小盒子(依次编号为1、2、3……x),每个小盒子排成一排,每个小盒子里都有一个甜品,每个甜品都有一个对应的幸福值。
由于需要控制每天糖分的摄入量,他给自己设下规矩:不能选择相邻的甜品。请你帮他计算一下他能获得的最大幸福值。

输入格式:

输入两行
第一行为x(小盒子数量,1<=x<=100
第二行为x个值,每个值分别代表每个小盒子中甜品可获得的幸福值。(0<=幸福值<=400

输入样例:

4
1 2 3 1

输出样例:

4

样例解释

hxj选择吃1号甜品 (幸福值 = 1) ,然后选择吃 3 号甜品 (幸福值 = 3)。获得到的最高幸福值 = 1 + 3 = 4 。

输入样例:

5
2 7 9 3 1

输出样例:

12

样例解释

hxj选择吃 1 号甜品(幸福值 = 2),选择3 号甜品 (幸福值 = 9),接着吃 5 号甜品 (幸福值 = 1)。 最后获得到的最大幸福值= 2 + 9 + 1 = 12 。

题目分析

本题是一道动态规划题
我们可以创建两个dp表,f和g,每个dp表中有x(盲盒数量)个元素。
接下来,我们开始考虑往f表和g表中填入数据
f[i]用来表示吃nums[i]甜品获得最大的幸福值,g用来表示不吃nums[i]甜品获得的幸福值。接下来我们就可以得到状态方程:
(1)f[i]=nums[i]+g[i-1](吃nums[i]甜品就不能吃nums[i-1]甜品)
(2)g[i]=max(f[i-1],g[i-1])(不吃nums[i]甜品我们可能吃nums[i-1]甜品,不一定要吃,所以我们选择吃或者不吃nums[i-1]甜品的最大值)

根据上面的状态方程我们就可以填写f和g两个dp表了,最后取吃nums[n-1]和不吃nums[n-1]甜品的最大值,即取f[n-1]和g[n-1]的最大值。(取n-1原因:数组下标从0开始)。

Java代码实现

import java.util.Scanner;
class Solution
{
    public int happy(int[] nums) {
        if(0 > nums.length-1) return 0;
        int n = nums.length;
        int[] f= new int[n];//创建f和g表
        int[] g= new int[n];
        f[0]=nums[1];
        g[0]=0;//两个表初始值写入
        for(int i = 1; i <= n-1; i++)//按顺序填表
        {
            f[i] = g[i - 1] + nums[i];
            g[i] = Math.max(g[i - 1], f[i - 1]);
        }
        return Math.max(f[n-1], g[n-1]);//返回最大幸福值
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int x= scan.nextInt();
        int[] nums=new int[x];
        for (int i = 0; i < x; i++) {
            nums[i]= scan.nextInt();
        }
        Solution solution=new Solution();
        int ret=solution.happy(nums);
        System.out.println(ret);
    }
}

3.First 50 Prime Numbers

Your program reads one natural numbers n in, and prints out the sum of the first n prime numbers starting from 2.

输入格式

A positive whole numbers n, which is less than 1000

输出格式

A number which is the sum of all the first n prime numbers.

输入样例

10

输出样例

129

题目解析

本题意思为:输入一个自然数n,将前n个素数相加,输出相加的结果。

代码实现

#include<stdio.h>
int main()
{
    int add=0;
    int n;
    scanf("%d",&n);
    for(int i=2;n>0;i++)
    {
        if(i==2)//2为特殊值,单拉出来考虑,不在循环前考虑防止n为0的情况
        {
            add+=2;
            n--;
            continue;
        }
        int flag=1;
        //下面循环语句判断素数
        for(int j=2;j<i;j++)
        {
            if(i%j==0)
            {
                flag=0;
                break;
            }
        }
        //如果为素数就加起来,并让n减1
        if(flag&&n>0)
        {
            add+=i;
            n--;
        }
    }
    printf("%d\n",add);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之索引与事务

一 索引的概念 一种帮助系统查找信息的数据 数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址无须对整个表进行扫描&#xff0c;通过物理地 址就可以找到所需数据是表中一列或者若干列值排序的方法 需要额外的磁盘空间 索引的作用 1 数据库…

【干货】Java开发者快速上手.NET指南

前言 前几天有小伙伴在技术群里发了一个微软官方出的&#xff1a;适用于Java开发人员的.NET快速入门免费电子书&#xff0c;今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料。 微软适用于Java开发人员的.NET快速入门指南 下载阅读地址&#xff1a;适用于 …

惟客数据CTO 钱勇:数据资产运营创新和实践

​企业如何做好数据资产运营&#xff0c;有效挖掘和利用数据资产&#xff1f; 近日&#xff0c;在由华东江苏大数据交易中心主办的“第四届数字经济科技大会”上&#xff0c;WakeData惟客数据CTO、星光数智CEO 钱勇 给出了自己的观点。 在演讲环节&#xff0c;钱勇以《数据资…

用tp6写的简单的eml的登录和curd

项目地址&#xff1a; 企业管理eml: 这是一个简单的eml (gitee.com) 1.登录和主页显示 1.1 登录功能逻辑图 1.2 控制器 app/controller/index.php php think make:validate LoginValidate <?php namespace app\controller;use app\BaseController; use app\model\User; …

IDEA设置全局配置

1、 IDEA设置全局配置 在IDEA中&#xff0c;选择 File -> Close Project 关闭项目。然后选择Customize -> All settings 进行全局配置&#xff0c;即所有项目公共的配置。 配置文件编码 配置控制台编码 配置maven 配置文件模板 配置文件模板作者和时间信息如下&#xff…

德勤:《亚太地区半导体行业展望》

2024年2月22日&#xff0c;德勤联合全球半导体联盟&#xff08;GSA&#xff09;对亚洲半导体产业链相关企业展开调研&#xff0c;邀请数位亚太地区主要半导体企业领导人&#xff0c;共同探讨半导体企业在当前环境下应如何通过数字技术曲线的领先优势保持业务竞争力和盈利能力&a…

“我的海外代购,卖起了香灰手串”

【潮汐商业评论/文】 “这个琉璃手串&#xff0c;去年在雍和宫请的&#xff0c;招财的&#xff1b;这个朱砂挂件&#xff0c;当时直播说可以补八字缺火&#xff0c;果断下单的&#xff1b;这个博主讲星座很准&#xff1b;这篇帖子八字说得很详细&#xff1b;我前两天买了‘财神…

qt5-入门-标签页部件QTabWidget-1

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 效果实现Qt Designer操作代码addStretch()解释 效果 首页有三个按钮和最近文件列表。 拖动窗口&#xff0c;按钮和文件列表仍然处…

CentOS7安装mysql-5.7.44单机和主从复制

官网下载地址&#xff1a; https://downloads.mysql.com/archives/community/ 1、单机安装 安装依赖 yum -y install libaio 解压安装 tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysqlcd /usr/local/mysql…

【Spring 篇】走进Java NIO的奇妙世界:解锁高效IO操作的魔法

欢迎来到Java NIO的神奇之旅&#xff01;在这个充满活力的世界里&#xff0c;我们将一起揭示Java NIO&#xff08;New I/O&#xff09;的奥秘&#xff0c;探索其在高效IO操作中的神奇魔法。无需担心&#xff0c;即使你是Java的小白&#xff0c;也能轻松领略这个强大而灵活的IO框…

【pycharm】作为Array查看出现数据无法显示问题(已解决)

【pycharm】作为Array查看出现数据无法显示问题&#xff08;已解决&#xff09; 当我们在调试代码的时候&#xff0c;需要对某个变量进行查看&#xff0c;就如同在matlab中&#xff0c;我们可以直接在工作区对某个变量进行双击查看矩阵变量的具体数值 在这里我遇到一个问题&am…

关于javascript数字精度丢失的解决办法

分析原因 众所周知&#xff0c;在JavaScript中计算两个十进制数的和&#xff0c;有时候会出现令人惊讶的结果&#xff0c;主要原因是计算机将数据存储为二进制所引起的&#xff0c;所以这并不是javascript存在的缺陷&#xff0c;而在其他语言中也有类似的问题。 例如下面的例子…

Java小项目--满汉楼

Java小项目–满汉楼 项目需求 项目实现 1.实现对工具包的编写 先创建libs包完成对jar包的拷贝和添加入库 德鲁伊工具包 package com.wantian.mhl.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import java.io.FileInputStream…

Java基础--集合

集合 1.可以动态的保存任意多个对象&#xff0c;使用比较方便。 2.提供了一系列方便的操作对象的方法&#xff1a;add&#xff0c;remove&#xff0c;set&#xff0c;get等。 3.使用集合添加&#xff0c;删除新元素的示意代码&#xff0c;简介明了。 集合主要是两种&#xff0…

c语言扫雷改进版

目录 文章目录 主体 整体架构流程 技术名词解释 技术细节 测试情况 文章目录 概要整体架构流程技术名词解释技术细节测试情况 主体 主体包括菜单&#xff0c;游戏规则简绍&#xff0c;选择进行与否 int main() {int input;srand((unsigned int)time(NULL));do{ menu()…

谷歌地图TMS地图服务地址收集2024,测试可用

对于普通的开发者或者GIS从业者来说&#xff0c;免费的底图影像服务&#xff0c;太重要了。之前写过一篇谷歌地图的TMS地址收集的博文&#xff0c;由于谷歌网站关闭已经不能用。最近又发现了谷歌在国内开放了其他地址&#xff0c;在这里给大家分享一下。 https://gac-geo.googl…

springboot Thymeleaf模版引擎使用

1.引入依赖 <!--thymeleaf视图引擎--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> html中要声明约束&#xff0c;这样就可以使用themelraf视…

EMC Unity存储系统(包含VNXe)常用检查命令

DELL EMC的Unity存储系统&#xff0c;包括VNXe存储系统的OS已经完全和Clariion 的VNX不同了&#xff0c;近期遇到很多关于EMC unity存储系统故障的一些初步检查需求&#xff0c;下面是一些对于DELL EMC Unity存储系统的最常用的底层检查命令&#xff0c;可以对系统故障有个初步…

小程序商城如何接入和设置支付宝支付功能?

众所周知&#xff0c;移动支付已成为电商平台不可或缺的核心组件。为了提升用户体验并拓宽支付渠道&#xff0c;许多小程序商城系统纷纷引入了支付宝作为支付选项。那么&#xff0c;如何在小程序商城系统中成功接入和设置支付宝支付功能呢&#xff1f;这似乎是大家当前所面临的…

电子台账:账页数据溯源

目录 1 前言 2 打开数据溯源面板 3 溯源面板操作 1 前言 账页中让人眼花缭乱的大堆数据来自哪里&#xff1f;从企业数据源表格中自动抓取数据后&#xff0c;如果感觉数据不对&#xff0c;就需要进行核对、排错&#xff0c;怎样确定程序到底抓取的哪些单元格&#xff1f;取数…