前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微众银行秋招笔试真题解析

微众银行秋招笔试真题解析

作者头像
五分钟学算法
发布2023-09-09 17:58:38
2090
发布2023-09-09 17:58:38
举报
文章被收录于专栏:五分钟学算法

大家好,我是吴师兄,关注我,每周更新大厂最新笔试题解析。

题目描述

小美想要买糖果店的一根长长的糖果,糖果店顾客可以从中选取一个位置然后老板会在那切断,糖果前端到那个切断位置的糖果就会出售给这位顾客。这个糖果其实不同段有着不同的口味,小美希望她选出来的糖果中各个段有着不同的口味,在这基础上希望能选出尽可能长的糖果。小美想知道她能买到最长多长的糖果,请你帮帮她。

输入描述

第一行1个整数n,表示糖果的长度。

第二行n个整数a1 a2 ... an,其中ai表示从糖果前端开始第i段的口味,每段均1为单位长度。

对于100%的数据,1<=n<=500001<=ai<=50000

输出描述

输出一行一个整数表示能买到的糖果的最长长度,且其中不包含相同口味.

示例一

输入
代码语言:javascript
复制
5
1 2 3 3 4
输出
代码语言:javascript
复制
3

说明

如果我们买长度为4的糖果,包含的口味为[1,2,3,3],存在了重复。

而长度为3时,包含的口味为[1,2,3],不存在重复。因此长度3为最长的不存在重复口味糖果长度。

解题思路

题目乍一看是LeetCode3、无重复字符的最长子串原题,但要注意审题和题目场景,还挺坑的。

题目要求只能从糖果的前端出发开始切一刀,所以无需进行滑窗,只需要判断从起始位置开始的最长无重复子数组即可,故直接使用哈希集合即可完成。

代码

代码语言:javascript
复制
# 题目:【哈希集合】微众银行2023秋招-切糖果
# 作者:闭着眼睛学数理化
# 算法:哈希集合
# 代码有看不懂的地方请直接在群上提问


n = int(input())
nums = list(map(int, input().split()))
hash_set = set()
# 遍历数组nums中的每一个元素num
for num in nums:
    # 若num从未出现过,则加入哈希集合中
    if num not in hash_set:
        hash_set.add(num)
    # 若num出现过,则直接退出循环
    else:
        break

# 退出循环后,哈希集合的长度即为答案
print(len(hash_set))

Java

代码语言:javascript
复制
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt();
        }
        
        Set<Integer> hashSet = new HashSet<>();
        
        int count = 0;
        for (int num : nums) {
            if (!hashSet.contains(num)) {
                hashSet.add(num);
                count++;
            } else {
                break;
            }
        }
        
        System.out.println(count);
    }
}

C++

代码语言:javascript
复制
#include <iostream>
#include <unordered_set>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;
    
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    
    unordered_set<int> hashSet;
    
    int count = 0;
    for (int num : nums) {
        if (hashSet.find(num) == hashSet.end()) {
            hashSet.insert(num);
            count++;
        } else {
            break;
        }
    }
    
    cout << count << endl;
    
    return 0;
}

时空复杂度

时间复杂度:O(N)。最差的情况是遍历整个数组。

空间复杂度:O(N)。哈希集合所需空间。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 输入描述
      • 输出描述
        • 示例一
          • 输入
          • 输出
        • 说明
        • 解题思路
        • 代码
        • Java
        • C++
        • 时空复杂度
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档