经典面试题 (二) 最长和谐子序列 Kaki的博客

5 篇文章 0 订阅

经典面试题 (二) 最长和谐子序列 Kaki的博客

问题描述:
    和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是 1。现给定一个整数数组 nums,请在所有可能的子序列中找到最长的和谐子序列的长度
并输出最长的和谐子序列。数组的子序列是一个由数组派生出来的序列,它可以
通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
要求:

    完成题目对应的程序模板(HarmoniouslySequence)中的方法:
    int maxHarmoniouslySequence(int[] nums);
    该方法的入口参数 nums 为给定的整数数组;
    方法返回值为满足要求的最大和谐子序列的长度。

样例:

    ◼ 样例 1
    输入:nums = [1,3,2,2,5,2,3,7]
    输出:5
    解释:最长的和谐子序列是 [3,2,2,2,3],所以输出该和谐子序列的长度为 5

    ◼ 样例 2
    输入:nums = [1,1,1,1]
    输出:0
    解释:给定的数组中不存在和谐子序列,所以输出结果为 0

解答:

package com.kaki.test;

import java.util.*;

/**
 * @author Kaki Nakajima
 * @date   2020-05-15
 * @desc   最长和谐子序列
 */
public class HarmoniouslySequence {

    /**
     * 最长和谐子序列
     * @param nums
     * @return
     */
    public static int maxHarmoniouslySequence(int[] nums){

        //序列 计数器
        int count=0;

        //第一步对数组进行排序
        for (int i = 0; i < nums.length; i++) {
            int oneElement = nums[i];
            for (int j = 0; j < nums.length-1; j++) {
                int twoElement = nums[j];
                if(oneElement>=twoElement){
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] =temp;
                }
            }
        }
        System.out.println("第一步 排序:"+Arrays.toString(nums));

        //第二步 统计每个数字出现的次数
        HashMap<String, Object> countMap = new HashMap<String, Object>();
        for (int i : nums) {
            if((countMap.get(i+"")) == null){
                countMap.put(i+"",1);
            }else {
                countMap.put(i+"",((Integer) countMap.get(i+""))+1);
            }
        }
        System.out.println("第二步 计数:"+ countMap);

        //统计相邻数字的最大值
        Set<Map.Entry<String, Object>> entries = countMap.entrySet();
        ArrayList tempArray = new ArrayList<Integer>();
        for (Map.Entry<String, Object> entry : entries) {
            HashMap hashMap = new HashMap();
            hashMap.put(entry.getKey(), entry.getValue());
            tempArray.add(hashMap);
        }

        //迭代数组进行比较
        for (int i = 0; i < tempArray.size(); i++) {

            for (int j = 1; j < tempArray.size()-1; j++) {
                Map<String,Object> mapi = (Map<String,Object>) tempArray.get(i);
                Map<String,Object> mapj = (Map<String,Object>) tempArray.get(j);
                Set<Map.Entry<String, Object>> entriesi = mapi.entrySet();
                Set<Map.Entry<String, Object>> entriesj = mapj.entrySet();

                int i_key = 0;
                int i_value = 0;
                int j_key = 0;
                int j_value = 0;
                for (Map.Entry<String, Object> entryi : entriesi) {
                    i_key = Integer.valueOf(entryi.getKey()) ;
                    i_value = (Integer)entryi.getValue();
                }

                for (Map.Entry<String, Object> entryj : entriesj) {
                    j_key = Integer.valueOf(entryj.getKey()) ;
                    j_value =(Integer)entryj.getValue();
                }

                //相邻数据
                if(j_key - i_key == 1){
                     if(j_value + i_value > count){
                         count = j_value + i_value;
                     }
                }
            }
        }

        System.out.println("第三步 比较结果,返回最大长度:"+count);
        return count;
    }

    public static void main(String[] args) {
        int [] arr = {1,1,2,2,5,2,3,7};
        maxHarmoniouslySequence(arr);
    }
}

此处方法只是实现之一,如有更高效的方法可以在评论区留言哈~

码云地址直通车

欢迎码云,B站,ins 关注Kaki Nakajima

要在VMware虚拟机上安装Kali Linux,您可以按照以下步骤进行操作: 1. 首先,确保您已经在VMware Workstation中创建了一个新的虚拟机并完成了基本设置。 2. 然后,在安装Kali Linux之前,您需要准备Kali Linux的ISO映像文件。您可以从官方网站下载最新版本的Kali Linux,并将其保存到您的计算机上的合适位置。 3. 打开VMware Workstation,并选择您已创建的虚拟机。 4. 在虚拟机设置中,添加一个CD/DVD硬件,并将ISO映像文件的路径设置为之前下载的Kali Linux ISO文件的位置。 5. 启动虚拟机,它将从Kali Linux的ISO映像文件启动。 6. 在虚拟机中,按照安装向导的指示进行Kali Linux的安装。您可以选择安装位置、分区设置和其他选项。 7. 完成安装后,虚拟机将重新启动,并您将能够进入全新安装的Kali Linux系统。 请注意,安装Kali Linux时,您可能需要对虚拟机的一些设置进行调整,例如内存、处理器和网络设置,以确保虚拟机的性能和功能满足您的需求。 另外,安装VMware Tools是一个可选的步骤,它可以提供更好的虚拟机性能和功能。您可以通过在虚拟机中选择菜单中的“安装VMware Tools”选项来安装VMware Tools。然后,您可以按照向导的指示进行安装,并根据需要进行设置。 总结: 1. 准备Kali Linux的ISO映像文件并将其保存到计算机上。 2. 在VMware Workstation中创建新的虚拟机并进行基本设置。 3. 在虚拟机设置中,添加CD/DVD硬件并将ISO映像文件路径设置为Kali Linux ISO文件的位置。 4. 启动虚拟机,并按照Kali Linux的安装向导进行安装。 5. 完成安装后,重新启动虚拟机,并进入新安装的Kali Linux系统。 请根据您的具体需求和环境进行相应的调整和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KakiNakajima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值