华为OD机试-相同数字的积木游戏-2022Q4 A卷-Py/Java/JS

小华和小薇一起通过玩积木游戏学习数学。
他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。
小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同目所处位置最远的2块积木块,计算他们的距离。
小薇请你帮忙替她解决这个问题。
输入描述
第一行输入为N,表示小华排成一排的积大总数。
接下来 N 行每行一个数字,表示小花排成一排的积大上数字。
输出描述
相同数字的积木的位置最远距离;
如果所有积木数字都不相同,请返回 -1

示例1:

输入:

5
1
2
3
1
4

输出:

3

示例2:

输入:

2
1
2

输出:

-1

备注

0<= 积木上的数字< 10^9

1<= 积木长度 <= 10^5

Java 代码

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
import java.math.BigInteger;
 
class Main {
    
	public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
 
        //计算频度超过2的数字
        Map num_count = new HashMap<>();
        for (int i = 0; i < n; i++) {
            num_count.put(nums[i], num_count.getOrDefault(nums[i], 0) + 1);
        }
 
        Set max_num = new HashSet<>();
        for (Map.Entry entry : num_count.entrySet()) {
            if (entry.getValue() >= 2) {
                max_num.add(entry.getKey());
            }
        }
 
 
        //找到最远出现位置
        int result = -1;
        for (Integer i : max_num) {
            int left = 0, right = n - 1;
            while (nums[left] != i) {
                left++;
            }
            while (nums[right] != i) {
                right--;
            }
            if (left <= right) {
                result = Math.max(result, right - left);
            }
        }
 
        
        System.out.print(result);
        
    }
 
}

Python代码

import functools
import sys
 
# 处理输入
n = int(input())
 
nums = []
for i in range(n):
    nums.append(int(input()))
 
#计算频度超过2的数字
 
num_count = {}
for i in range(n):
    if nums[i] in num_count:
        num_count[nums[i]] = num_count[nums[i]] + 1
    else:
        num_count[nums[i]] = 1
 
 
max_num = set([])
for item in  num_count:
    if num_count[item] >1:
        max_num.add(item)
 
 
 
#找到出现最远位置
result = -1;
for i in max_num:
    left = 0
    right = n - 1
    while (nums[left] != i):
        left+=1
    
    while (nums[right] != i):
        right-=1
    
    if (left <= right) :
        result =max(result, right - left)
 
print(result)

JS代码

function main(n,nums) {
    //计算频度超过2的数字
 
    let num_count = {}
    for (let i=0;i1)
            max_num.add(item)
    }
    
    
    
    //找到出现最远位置
    let result = -1;
    for (let i of max_num){
        let left = 0
        let right = n - 1
        while (nums[left] != i)
            left+=1
        
        while (nums[right] != i)
            right-=1
        
        if (left <= right)
            result =Math.max(result, right - left)
    }
    
    console.log(result)
 
}
 
main(5, [1,2,3,1,4])

你可能感兴趣的:(游戏,java,javascript,华为)