【华为OD题库-037】跳房子2-java

news2024/11/13 16:45:13

题目

跳房子,也叫跳飞机,是一种世界性的儿童游戏游戏。参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子被选完,房子最多的人获胜。
跳房子的过程中,如果有踩线等违规行为会结束当前回合,甚至可能倒退几步.假设房子的总格数是count,小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红三个回合跳到最后一格?如果有,请输出索引和最小的步数组合(数据保证索引和最小的步数组合是唯一的)。
注意:数组中的步数可以重复,但数组中的元素不能重复使用
输入描述:
第一行输入为房子总格数count,它是int整数类型
第二行输入为每回合可能连续跳的步数,它是int整数数组类型
输出描述
返回索引和最小的满足要求的步数组合(顺序保持steps中原有顺序)
补充说明:
count<=10000,3<=steps.length<=10000,-100000<=steps[i]<=100000
示例1
输入:
9
[1,4,5,2,0,2]
输出:
[4,5,0]
示例2
输入:
9
[1,5,2,0,2,4]
输出:
[5,2,2]
示例3
输入:
12
[-1,2,4,9]
输出:
[-1,4,9]
示例4:
输入
15
[1,9,4,25,10,8,7,5]
输出
[1,4,10]
说明
符合条件的步数集合有:
[1,9,5]
它的下角标之和为:0+1+7=8 ;
[1,4,10]
它的下角标之和为:0+2+4=6
因为6<8,故输出[1,4,10]。

思路

两种思路:

  1. 回溯法
  2. 双指针

回溯法

列举所有的组合,找到符合条件的组合,排列组合思路详见:【JAVA-排列组合】一个套路速解排列组合题

双指针

回溯法可能会超时,所以推荐双指针法。

比如输入的数组是:1,4,5,2,0,2,目标数字是9
先将nums按照升序排序:0 1 2 2 4 5
外层遍历k,范围为0,len-2;
内层设置两个变量,i指向k+1位置,j指向最后一个位置,如下:
在这里插入图片描述
现在计算这三个数的和,0+1+5=6,小于9,将i右移动到下一个不同的值(比如此时nums[2]、nums[3]均为2,如果i=2满足要求,那么i=3时也满足要求,题目要求索引和的最小值,所以要尽可能选则索引小的值,这里就需要保证前面的2的索引是小于后面的2的索引的
在这里插入图片描述
此时和为7,还是小于9,继续将i右移动到下一个不同的值
在这里插入图片描述

此时和为9满足条件,将此时的i,j,k存下来
依次类推,再考虑k=2,i=3,j=len-1的情况。
以上思路基本能够找到三个不同的数,让它们的和等于给定的数,和题目在以下方面还有出入:

  1. 题目要求输出索引和最小的组合
  2. 输出的顺序需要于输入的顺序一致

要解决上面两个问题,只需要新建一个对象House,有两个属性:值和索引。如果我们把输入的nums转为List < House > houses,因为需要将nums按照值的升序排序,所以house可以实现Comparable接口,它按照值的升序排序,当值相等时,应该按照索引的升序排序(当出现两个相同的数,保证前面值的索引小于后面值的索引),houses中存放了索引信息,可以供后续比较得到最小的索引和;而针对“输出的顺序需要于输入的顺序一致”,当我们找到满足条件的组合时,我们再按照对象中存放的索引重新按照从小到大排序即可。

题解

回溯法

package hwod;

import java.util.*;

public class JumpHouse {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        sc.nextLine();
        String str = sc.nextLine();
        int[] nums = Arrays.stream(str.substring(1, str.length() - 1).split(",")).mapToInt(Integer::parseInt).toArray();
        int[] res = jumpHouse(nums, count);
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < res.length; i++) {
            if (i != 0) sb.append(",");
            sb.append(res[i]);
        }
        sb.append("]");
        System.out.println(sb);
    }

    private static List<Integer> res = new ArrayList<>();
    private static int minestIndex = Integer.MAX_VALUE;

    private static int[] jumpHouse(int[] nums, int count) {
        LinkedList<Integer> path = new LinkedList<>();
        dfs(nums, 0, path, count, 0);
        return res.stream().mapToInt(i -> i).toArray();

    }

    private static void dfs(int[] nums, int start, LinkedList<Integer> path, int target, int indexSum) {
        if (path.size() == 3) {
            if (target == 0 && indexSum < minestIndex) {
                minestIndex = indexSum;
                res = new ArrayList<>(path);
            }
            return;
        }
        for (int i = start; i < nums.length; i++) {
            path.addLast(nums[i]);
            dfs(nums, i + 1, path, target - nums[i], indexSum + i);
            path.removeLast();
        }
    }
}

双指针

package hwod;

import java.util.*;

public class JumpHouse2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        sc.nextLine();
        String str = sc.nextLine();
        int[] nums = Arrays.stream(str.substring(1, str.length() - 1).split(",")).mapToInt(Integer::parseInt).toArray();

        List<House> houses = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            houses.add(new House(i, nums[i]));
        }

        int[] res = jumpHouse(houses, count);
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < res.length; i++) {
            if (i != 0) sb.append(",");
            sb.append(res[i]);
        }
        sb.append("]");
        System.out.println(sb);
    }



    private static int[] jumpHouse(List<House> houses, int count) {
        Collections.sort(houses);
        int[] res = new int[3];
        int minIdxSum = Integer.MAX_VALUE;
        for (int k = 0; k < houses.size()-2; k++) {
            if(houses.get(k).getVal()>count) break;
            if(k>0&&houses.get(k).getVal()==houses.get(k-1).getVal()) continue;
            int i = k + 1, j = houses.size() - 1;
            while (i < j) {
                int sum = houses.get(k).getVal() + houses.get(i).getVal() + houses.get(j).getVal();
                if (sum < count) {
                    while (i<j&&houses.get(i).getVal()==houses.get(++i).getVal());
                } else if (sum > count) {
                    while (i<j&&houses.get(j).getVal()==houses.get(--j).getVal());
                } else {
                    int idxSum=houses.get(k).getId() + houses.get(i).getId() + houses.get(j).getId();
                    if (idxSum < minIdxSum) {
                        minIdxSum = idxSum;
                        List<House> houseAns = Arrays.asList(houses.get(k), houses.get(i), houses.get(j));
                        houseAns.sort(Comparator.comparingInt(House::getId));
                        res = new int[]{houseAns.get(0).getVal(), houseAns.get(1).getVal(), houseAns.get(2).getVal()};
                    }
                    while (i<j&&houses.get(i).getVal()==houses.get(++i).getVal());
                    while (i<j&&houses.get(j).getVal()==houses.get(--j).getVal());
                }
            }
        }
        return res;

    }


}

class House implements Comparable<House> {
    private int id;
    private int val;

    public House(int id, int val) {
        this.id = id;
        this.val = val;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    /**
     * 自定义排序,按照val倒序,索引升序排列,保证去重时始终选的较小值的索引
     * @param o the object to be compared.
     * @return
     */
    @Override
    public int compareTo(House o) {
        if(o.val==this.val) return this.getId() - o.getId();
        return this.val - o.val;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React中如何解决点击<Tree>节点前面三角区域不触发onClick事件

React中如何解决点击节点前面三角区域不触发onClick事件&#xff0c;如何区别‘左边’和‘右边’区域点击逻辑呢&#xff1f;&#xff08;Tree引用开源组件TDesign&#xff09; 只需要在onClick里面加限制一下就行&#xff1a; <TreeexpandMutexactivabletransitiondata{t…

Word/PPT/PDF怎么免费转为JPG图片?

1、打开金鸣表格文字识别网站。 2、点击导航条上的“软件下载” 3、安装并打开金鸣表格文字识别软件。 4、点击顶部导航栏的“文件转图片”。 5、选择需要转换成图片的文件&#xff08;支持Word/PPT/PDF&#xff09;. 6、点“打开”程序将自动分页转换为图片。

【SpringBoot3+Vue3】五【完】【实战篇】-前端(配合后端)

目录 一、环境准备 1、创建Vue工程 2、安装依赖 2.1 安装项目所需要的vue依赖 2.2 安装element-plus依赖 2.2.1 安装 2.2.2 项目导入element-plus 2.3 安装axios依赖 2.4 安装sass依赖 3、目录调整 3.1 删除部分默认目录下文件 3.1.1 src/components下自动生成的…

外贸自建站服务器怎么选?网站搭建的工具?

外贸自建站服务器用哪个好&#xff1f;如何选海洋建站的服务器&#xff1f; 外贸自建站是企业拓展海外市场的重要手段之一。而在这个过程中&#xff0c;选择一个适合的服务器对于网站的稳定运行和优化至关重要。海洋建站将为您介绍如何选择适合的外贸自建站服务器。 外贸自建…

干货 | 携程酒店基于血缘元数据的数据流程优化实践

作者简介 九号&#xff0c;携程数据技术专家&#xff0c;关注数据仓库架构、数据湖、流式计算、数据治理。 一、背景 元数据MetaData狭义的解释是用来描述数据的数据&#xff0c;广义的来看&#xff0c;除了业务逻辑直接读写处理的那些业务数据&#xff0c;所有其它用来维持整个…

C语言之字符串函数

C语言之字符串函数 文章目录 C语言之字符串函数1. strlen的使用和模拟实现1.1 strlen的使用1.2 strlen的模拟实现 2. strcpy的使用和模拟实现2.1 strcpy的使用2.2 strncpy的使用2.3 strcpy的模拟实现 3. strcat的使用和模拟实现3.1 strcat的使用3.2 strncat3.3 strcat的模拟实现…

深度学习中的Dropout正则化:原理、代码实现与实际应用——pytorch框架下如何使用dropout正则化

目录 引言 一、导入包 二、dropout网络定义 三、创建模型&#xff0c;定义损失函数和优化器 四、加载数据 五、训练train 六、测试 引言 dropout正则化的原理相对简单但非常有效。它在训练神经网络时&#xff0c;以一定的概率&#xff08;通常是在0.2到0.5之间&#xff…

基于C#实现赫夫曼树

赫夫曼树又称最优二叉树&#xff0c;也就是带权路径最短的树&#xff0c;对于赫夫曼树&#xff0c;我想大家对它是非常的熟悉&#xff0c;也知道它的应用场景&#xff0c;但是有没有自己亲手写过&#xff0c;这个我就不清楚了&#xff0c;不管以前写没写&#xff0c;这一篇我们…

GeoTrust SSL数字安全证书介绍

一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书&#xff0c;它是一种支持OpenSSL的数字证书&#xff0c;具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商&#xff0c;为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…

Docker+ Jenkins+Maven+git自动化部署

环境&#xff1a;Centos7 JDK1.8 Maven3.3.9 Git 2.40 Docker 20.10.17 准备工作&#xff1a; 安装Docker Centos7默认的yum安装的docker是1.13&#xff0c;版本太低&#xff0c;很多镜像都要Docker版本要求&#xff0c;升级Docker版本。 卸载已安装Docker: yum …

快速在WIN11中本地部署chatGLM3

具体请看智谱仓库github&#xff1a;GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 或者Huggingface:https://huggingface.co/THUDM/chatglm3-6b 1. 利用Anaconda建立一个虚拟环境&#xff1a; conda create -n chatglm3 pyt…

U盘启动制作工具Rufus

U盘启动制作工具Rufus 下载U盘启动制作工具Rufus&#xff0c;进入Rufus官网&#xff1a;http://rufus.ie/en/&#xff0c;打开之后往后滑动&#xff0c;找到download即可点击下载。 需要插入U盘 首先需要插入U盘&#xff0c;如果U盘有重要文件一定要备份&#xff0c;然后右键…

DB2中实现数据字段的拼接(LISTAGG() 与 xml2clob、xmlagg)

DB2中实现数据字段拼接&#xff08;LISTAGG 与 xml2clob、xmlagg&#xff09; 1. 使用函数LISTAGG()1.1 同oracle实现方式1.2 DB2中使用LISTAGG()1.2.1 关于DB2版本1.2.2 数据准备1.2.3 代码实现 2 解决DB2中关于 LISTAGG() 超长问题2.1 使用xmlagg xmlelement2.2 将xml标签去…

【论文阅读笔记】Smil: Multimodal learning with severely missing modality

Ma M, Ren J, Zhao L, et al. Smil: Multimodal learning with severely missing modality[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(3): 2302-2310.[开源] 本文的核心思想是探讨和解决多模态学习中的一个重要问题&#xff1a;在训练和测…

SpringBoot整合Redis,redis连接池和RedisTemplate序列化

SpringBoot整合Redis 1、SpringBoot整合redis1.1 pom.xml1.2 application.yml1.3 配置类RedisConfig&#xff0c;实现RedisTemplate序列化1.4 代码测试 2、SpringBoot整合redis几个疑问&#xff1f;2.1、Redis 连接池讲解2.2、RedisTemplate和StringRedisTemplate 3、RedisTemp…

DALSA.SaperaLT.SapClassBasic无法加载,试图加载格式不正确的程序,c#

情景&#xff1a;用c#wpf写DALSA线扫相机的项目&#xff0c;生成时不报错&#xff0c;运行到DALSA相关的代码就报错找不到dll&#xff08;DALSA的技术支持没给到任何支持 &#xff09; 一.根据框架选择dll 如果是.net framework框架&#xff08;比如说.net480&#xff09;&am…

【LeetCode刷题-链表】--61.旋转链表

61.旋转链表 方法&#xff1a; 记给定的链表的长度为n,注意当向右移动的次数k>n时&#xff0c;仅需要向右移动k mod n次即可&#xff0c;因为每n次移动都会让链表变为原状 将给定的链表连接成环&#xff0c;然后将指定位置断开 /*** Definition for singly-linked list.*…

【OJ比赛日历】快周末了,不来一场比赛吗? #11.25-12.01 #17场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-11-25&#xff08;周六&#xff09; #9场比赛2023-11-26…

Linux(Centos)上使用crontab实现定时任务(定时执行脚本)

场景 Windows中通过bat定时执行命令和mysqldump实现数据库备份&#xff1a; Windows中通过bat定时执行命令和mysqldump实现数据库备份_mysqldump bat-CSDN博客 上面讲windows中使用bat实现定时任务的方式&#xff0c;如果是在linux上可以通过crontab实现。 cron是服务名称。…

案例018:基于微信小程序的实习记录系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…