shopee笔试 shoppee笔试题 虾皮笔试 1008
笔试时间:2024年10月08日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目:查找非递减子序列的个数
给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列个数,递增子序列中至少有两个元素。数组中可能含有重复元素,如果出现两个整数相等,也可以视作递增序列的一种特殊情况。
其他时间限制:1000ms内存限制:256MB
样例输入一
[0,2,7]
样例输出一
4
说明:序列:[[0,2],[0,2,7],[0,7],[2,7]]
样例输入二
[3,5,7,1]
样例输出二
4
说明:序列:[[3,5],[3,5,7],[3,7],[5,7]]
样例输入三
[4,6,7,7]
样例输出三
8
说明:序列 [[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
参考题解
DFS+回溯,枚举所有可能的情况。需要注意的是去重,dfs的每一层需要用一个set存储已经枚举过的数字,避免出现重复。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <unordered_set>
class Solution {
public:
int res = 0;
/**
* Note: 类名、方法名、参数名已经指定,请勿修改
*
*
*
* @param arr int整型 vector
* @return int整型
*/
int find(vector<int>& arr) {
// write code here
dfs(arr, -100000000, 0, 0);
return res;
}
// 参数的含义如下:
// (数组,当前序列的最大数,当前层从数组的第几个数开始枚举,当前序列的长度)
void dfs(vector<int>& arr, int curmax, int start, int len) {
// 序列长度大于1就把答案加一
if (len > 1) res++;
if (start == arr.size()) return;
// 用来存该层已经枚举过的数字
unordered_set<int> s;
for (int i = start; i < arr.size(); i++) {
// 大于等于最大数且访问过该数才枚举
if (arr[i] >= curmax && s.find(arr[i]) == s.end()) {
s.insert(arr[i]);
dfs(arr, arr[i], i + 1, len + 1);
}
}
}
};
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.HashSet;
import java.util.List;
class Solution {
public int res = 0;
public int find(List<Integer> arr) {
dfs(arr, -100000000, 0, 0);
return res;
}
// 参数的含义如下:
// (数组,当前序列的最大数,当前层从数组的第几个数开始枚举,当前序列的长度)
public void dfs(List<Integer> arr, int curmax, int start, int len) {
// 序列长度大于1就把答案加一
if (len > 1) res++;
if (start == arr.size()) return;
// 用来存该层已经枚举过的数字
HashSet<Integer> s = new HashSet<>();
for (int i = start; i < arr.size(); i++) {
// 大于等于最大数且访问过该数才枚举
if (arr.get(i) >= curmax && !s.contains(arr.get(i))) {
s.add(arr.get(i));
dfs(arr, arr.get(i), i + 1, len + 1);
}
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
class Solution:
def __init__(self):
self.res = 0
def find(self, arr):
self.dfs(arr, -100000000, 0, 0)
return self.res
# 参数的含义如下:
# (数组,当前序列的最大数,当前层从数组的第几个数开始枚举,当前序列的长度)
def dfs(self, arr, curmax, start, length):
# 序列长度大于1就把答案加一
if length > 1:
self.res += 1
if start == len(arr):
return
# 用来存该层已经枚举过的数字
s = set()
for i in range(start, len(arr)):
# 大于等于最大数且访问过该数才枚举
if arr[i] >= curmax and arr[i] not in s:
s.add(arr[i])
self.dfs(arr, arr[i], i + 1, le
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024 BAT笔试合集 文章被收录于专栏
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。