华为OD机考算法题:计算最大乘积

news2024/12/16 19:17:51

题目部分

题目计算最大乘积
难度
题目说明给定一个元素类型为小写字符串的数组,请计算两个没有相同字符的元素长度乘积的最大值。
如果没有符合条件的两个元素,返回 0。
输入描述输入为一个半角逗号分隔的小写字符串的数组,2<= 数组长度<=100,0< 字符串长度<= 50。
输出描述两个没有相同字符的元素长度乘积的最大值。
补充说明
------------------------------------------------------
示例
示例1
输入iwdvpbn,hk,iuop,iikd,kadgpf
输出14
说明数组中有 5 个元素。
iwdvpbn 与 hk 无相同的字符,满足条件,iwdvpbn 长度为 7,hk 长度为 2,乘积为 14 (7 * 2)。
iwdvpbn 与 iuop、iikd、kadgpf 都有相同的字符,不满足条件。
iuop 与 iikd、kadgpf 均有相同的字符,不满足条件。
iikd 与 kadgpf 有相同的字符,不满足条件。
因此,输出为 14。


解读与分析

题目解读

给定一个长字符串,以 “,” 为间隔符分隔成多个字符串。请从这些字符串中找出两个字符串,保证在这两个字符串中不存在相同字符的前提下,使两个字符串的长度的乘积最大。

分析与思路

此题的步骤可以分为解析字符串,排序、数据初始化、遍历,详细说明如下:
1. 解析字符串。对输入的字符串以 “,” 为间隔符,把它们解析成多个字符串,放到数组 stringArr 中。
2. 对数组 stringArr 排序。排序规则为长度最长的字符串排在最前面。
3. 数据初始化。对已排序的 stringArr,统计每个元素(字符串)所包含的字符,放到集合中;计算字符串的长度。创建两个数组,第一个数组为 charSetArr,其第 i 个元素为 stringArr 中第 i 个元素包含的字符结合;第二个数组 lengArr,其第 i 个元素为 stringArr 中第 i 个元素的长度。
4. 遍历。
1)  初始化乘积,设为 maxProduct,初始值 0。
2)  两两比较字符串。把字符串 stringArr[0] 分别与 
stringArr[1]、stringArr[2] …… stringArr[n -1] 进行比较;之后把字符串 stringArr[1] 分别与 stringArr[2]、stringArr[3] …… stringArr[n -1] 比较。
比较规则是,在比较时,如果不存在交集,即charSetArr[0] 与 charSetArr[i] 不存在交集,则计算 lengthArr[0] 与 lengthArr[i] 的乘积,设为 tmpProduct,如果 tmpProduct 大于 maxProduct,则把 tmpProduct 赋值个 maxProduct。当找到 charSetArr[0] 与 charSetArr[i] 不存在交集后,不再判断 charSetArr[0]
与  其他字符串是否存在交集,因为已经不存在乘积比它更大。

此方法的时间复杂度为 O(n^{2}),空间复杂度为O(n^{2})。


代码实现

Java代码

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * 计算最大乘积
 * 
 * @version 0.1
 * @author Frank
 *
 */
public class StringLengthMaxProduct {
    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	while (sc.hasNext()) {
	    String input = sc.nextLine();
	    processStringLengthMaxProduct( input );
	}
    }
    
    private static void processStringLengthMaxProduct( String input )
    {
	String[] strArr = input.split( "," );
	
	Arrays.sort( strArr, new Comparator<String>() {
	    @Override
	    public int compare(String o1, String o2) {
		// 长度最长的排在最前面
		return o2.length() - o1.length();
	    }
	    
	});
	
	Set[] charSetArr = new HashSet[ strArr.length ];
	int[] lengthArr = new int[ strArr.length ];
	initCharSetInfo( strArr, charSetArr, lengthArr );
	int ret = getMaxProduct( charSetArr, lengthArr );
	System.out.println( ret );
    }
    
    
    private static void initCharSetInfo( String[] strArr, Set[] charSetArr,int[] lengthArr )
    {
	for( int i = 0; i < strArr.length; i ++ )
	{
	    String curStr = strArr[i];
	    lengthArr[i] = curStr.length();
	    
	    Set<Character> curSet = new HashSet<Character>();
	    for( int j = 0; j < curStr.length(); j ++ )
	    {
		curSet.add( curStr.charAt( j ) );
	    }
	    charSetArr[i] = curSet;
	}
    }

    private static int getMaxProduct( Set[] charSetArr,int[] lengthArr )
    {
	int maxProduct = 0;
	int size = charSetArr.length;
	boolean needBreak = false;
	for( int i = 0; i < size; i ++ )
	{
	    for( int j = i + 1; j < size; j ++ )
	    {
		if( ( j == i + 1 ) && ( lengthArr[i] * lengthArr[j] < maxProduct ) )
		{
		    needBreak = true;
		    break;
		}
		    
		// 包含相同字符
		if( !Collections.disjoint( charSetArr[i], charSetArr[j]))
		{
		    continue;
		}
		int product = lengthArr[i] * lengthArr[j];
		if( product > maxProduct)
		{
		    maxProduct = product;
		}
		break;
	    }
	    if( needBreak )
	    {
		break;
	    }
	}
	return maxProduct;
    }
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        processStringLengthMaxProduct(line);
    }
}();

function processStringLengthMaxProduct(input) {
    var strArr = input.split(",");
    strArr.sort(function(a, b) {
        return b.length - a.length;
    });

    var charSetArr = new Array();
    var lengthArr = new Array();
    initCharSetInfo(strArr, charSetArr, lengthArr);
    var ret = getMaxProduct(charSetArr, lengthArr);
    console.log(ret);
}

function initCharSetInfo(strArr, charSetArr, lengthArr) {
    for (var i = 0; i < strArr.length; i++) {
        var curStr = strArr[i];
        lengthArr[i] = curStr.length;

        var curSet = new Set();
        for (var j = 0; j < curStr.length; j++) {
            curSet.add(curStr.charAt(j));
        }
        charSetArr[i] = curSet;
    }
}

function getMaxProduct(charSetArr, lengthArr) {
    var maxProduct = 0;
    var size = charSetArr.length;
    var needBreak = false;
    for (var i = 0; i < size; i++) {
        for (var j = i + 1; j < size; j++) {
            if ((j == i + 1) && (lengthArr[i] * lengthArr[j] < maxProduct)) {
                needBreak = true;
                break;
            }

            // 包含相同字符
            if (!isSetDisjoint(charSetArr[i], charSetArr[j])) {
                continue;
            }
            var product = lengthArr[i] * lengthArr[j];
            if (product > maxProduct) {
                maxProduct = product;
            }
            break;
        }
        if (needBreak) {
            break;
        }
    }
    return maxProduct;
}

function isSetDisjoint(charSet1, charSet2) {
    for (var ele of charSet2) {
        if (charSet1.has(ele)) {
            return false;
        }
    }
    return true;
}

(完)

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

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

相关文章

Painter:使用视觉提示来引导网络推理

文章目录 1. 论文2. 示意图3. 主要贡献4. 代码简化 1. 论文 paper:Images Speak in Images: A Generalist Painter for In-Context Visual Learning github:https://github.com/baaivision/Painter 2. 示意图 3. 主要贡献 在 In-context Learning 中&#xff0c;作为自然语言…

【2018统考真题】给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 效的算法,找出数组中未出现的最小正整数。

【2018统考真题】给定一个含n(n≥1&#xff09;个整数的数组&#xff0c;请设计一个在时间上尽可能高 效的算法,找出数组中未出现的最小正整数。例如,数组{-5,3,2,3}中未出现的最小正 整数是1;数组{1,2,3}中未出现的最小正整数是4。 代码思路&#xff1a; 题目让你找未出现的最…

2024年北京/上海/广州/深圳PMP®项目管理认证精品班招生简章

PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。国内众多企业已把PMP认证定为项目经理人必须取得的重要资质。 【PMP认证收益】 1、能力的提升&#xff08;领导力&#xff0c;执行力&#xff0c;创新能力&#xff0c…

国产 2443A 峰值功率分析仪

2443A 峰值功率分析仪 频率范围覆盖&#xff1a;9kHz至67GHz 产品综述 2443A峰值功率分析仪由峰值功率分析仪主机和系列化峰值功率探头组成&#xff0c;可用于测量和分析微波毫米波脉冲调制信号的多种幅度和时间参数&#xff0c;是表征脉冲调制信号特性的综合性测量与分析仪器。…

【2024秋招】2023-9-16 贝壳后端开发二面

1 自我介绍 2 秒杀系统 2.1 超卖怎么解决 3 redis 3.1 过期策略 3.2 过期算法 4 kafka 4.1 说一说你对kafka的了解 4.2 如何保证事务性消息 4.3 如何保证消息不丢失 4.4 消息队列的两种通信方式 点对点模式 如上图所示&#xff0c;点对点模式通常是基于拉取或者轮询…

Docker实战之一

一、前言 前两天看到一篇文章 再见了 Docker&#xff01;K8S 已成气候&#xff01;&#xff0c;K8S这么高端我们是还没有玩过的&#xff0c;Docker倒是实践过一把&#xff0c;这个系列会简单介绍一下实战的过程&#xff0c;具体背景是因为我们有时需要给门店提供一个相对稳定…

如何在IDEA中配置指定JDK版本?轻松解决!!!

有时候我们在导入项目&#xff0c;如果手动在IDEA中指定jdk版本&#xff0c;往往启动项目会报错误。 因此当我们新引入项目启动不了时可以检查一下自己IDEA中的jdk版本是否正确。 下面以配置jdk版本为11显示步骤&#xff1a; 1、配置 Project Structure 1.1、通过快捷键&qu…

阶乘与双阶乘的相关性质

阶乘与双阶乘的相关性质 双阶乘 基本性质 积分恒等式 极限近似 级数展开 阶乘 斯特林(Stirling)公式 gamma函数

信必优收到中国首批成立的期货公司之一表扬信

近日&#xff0c;信必优收到中国首批成立的期货公司之一的表扬信&#xff0c;客户极力表扬了我司员工卓越的职业操守&#xff0c;充满热情、勤奋努力&#xff1b;在工作中成长迅速&#xff0c;不仅对公司整体开发框架熟练掌握&#xff0c;对公司相关业务也理解深刻&#xff0c;…

进程控制(一):进程终止

文章目录 进程控制&#xff08;一&#xff09;进程终止运行正常退出码 运行异常进程正常/异常总结 进程控制&#xff08;一&#xff09; 在前文中&#xff0c;我们初步了解了进程的概念&#xff0c;以及通过fork函数来创建子进程&#xff0c;并对于为什么运行一个程序&#xf…

虹科分享 | 买车无忧?AR带来全新体验!

文章来源&#xff1a;虹科数字化与AR 阅读原文&#xff1a;https://mp.weixin.qq.com/s/XsUFCTsiI4bkEMBHcGUT7w 新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0…

Banana Pi BPI-W3(ArmSoM-W3) RK3588编解码之MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 同芯片的差异&#xff0c;为使用者…

提取存档提取操作没有完成出现意外错误,导致无法提取存档。错误Ox8007000E:内存资源不足,无法完成此操作。若要关闭此向导,请单击“完成“”。完成(F)

提取存档 提取操作没有完成 出现意外错误&#xff0c;导致无法提取存档。 错误Ox8007000E:内存资源不足&#xff0c;无法完成此操作。 若要关闭此向导&#xff0c;请单击"完成"”。完成(F) 取消 当我们解压一个普普通通的压缩包时&…

针对公网IP签发的IP地址SSL证书

传统的SSL证书是基于域名的&#xff0c;通常用于保护特定网站的通信。但随着技术的不断演进&#xff0c;一些情况需要更广泛的安全性&#xff0c;这就是IP地址SSL证书出现的原因。IP地址SSL证书是专门为公网IP地址签发的SSL证书&#xff0c;而不是针对特定域名。这意味着您可以…

CG Magic分享3dmax软件安装与打开文件转圈圈怎么办?

大家使用3dmax软件时&#xff0c;尤其&#xff0c;是初学者无论是安装3dmax软件还是打开max文件时&#xff0c;会遇到一类问题&#xff1a; 3dmax一直转圈不动&#xff1f; 3dmax总是转圈怎么办 大家遇到3dmax一直转圈圈是如何解决的呢&#xff1f;小编这里整理了一些3dmax软…

【科普知识】什么是模拟量控制?

模拟量控制是一种通过模拟量输入信号来控制伺服电机转矩或速度的方法。通过调整输入信号的大小&#xff0c;可以实现对电机转矩、速度或位置的精确控制。 在伺服运动控制中&#xff0c;大家可能经常听到“位置控制”&#xff0c;“速度控制”&#xff0c;“模拟量控制”等词。前…

电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计

电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计 0、基本理论 参考-Design of Ultra Wideband Power Transfer Networks的4.17小节的推导过程 n 次切比雪夫多项式定义为&#xff1a; n在1到5时的切比雪夫多项式表&#xff1a; 此表可以使用下面的代码计算得出&…

java通过jol-core库分析对象内存分布以及查看Synchronized锁升级过程

在Java开发中&#xff0c;我们可以借助jol-core这个库来查看对象内存信息。 引入依赖&#xff1a; <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.17</version> </dependency>…

深度学习系列52:多目标跟踪

1. 评价指标 1&#xff09;FP&#xff1a;False Positive&#xff0c;即真实情况中没有&#xff0c;但跟踪算法误检出有目标存在。 2&#xff09;FN&#xff1a;False Negative&#xff0c;即真实情况中有&#xff0c;但跟踪算法漏检了。 3&#xff09;IDS&#xff1a;ID Sw…

【数据结构】数组和字符串(六):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏列(Compressed Sparse Column,CSC)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行&#xff08;Compressed Sparse Row&#xff0c;CSR&#xff09;矩阵f. 压缩稀疏列&#xff08;Compressed Sparse …