科大讯飞笔试 科大讯飞笔试题 提前批 0713
笔试时间:2024年07月13日 提前批
历史笔试传送门:2023秋招笔试合集
第一题
题目:找01
牛牛拥有一个长度为 n 的01 串,现在他想知道,对于每个字符,在它前面的最近的不同字符的下标是多少?
输入描述
本题为多组测试数据。
第一行输入一个正整数 T(1<=t<=100),代表测试数据组数。
对于每组测试数据,第一行输入一个正整数 n(1<=n<=1000),代表初始 01串的长度。
第二行输入一个长度为 n的01串,代表初始字符串。
输出描述
对于每组测试数据,一行输出 n 个整数 a1,a2,...,an,其中 ai 代表初始字符串中第 i 个位置的字符前面,最近的不同字符的下标是 ai,特殊的,如果前面不存在不同字符,则输出 -1 表示不存在。
样例输入
1
4
1101
样例输出
-1 -1 2 3
参考题解
遍历字符串,不断记录0和1的下标,对于0就取上一次1的下标,并且更新0的下标;对于1则取上一次0的下标,更新1的下标。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
string s;
cin >> s;
int p0 = -1, p1 = -1;
vector<int> res(n, -1);
for (int i = 0; i < n; ++i) {
char c = s[i];
if (c == '0') {
res[i] = p1;
p0 = i + 1;
} else {
res[i] = p0;
p1 = i + 1;
}
}
for (int i = 0; i < n; ++i) {
if (i > 0) cout << " ";
cout << res[i];
}
cout << endl;
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T-- > 0) {
int n = sc.nextInt();
String s = sc.next();
int p0 = -1, p1 = -1;
Vector<Integer> res = new Vector<>(n);
for (int i = 0; i < n; ++i) {
res.add(-1);
}
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
if (c == '0') {
res.set(i, p1);
p0 = i + 1;
} else {
res.set(i, p0);
p1 = i + 1;
}
}
for (int i = 0; i < n; ++i) {
if (i > 0) System.out.print(" ");
System.out.print(res.get(i));
}
System.out.println();
}
sc.close();
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
def main():
T = int(input())
for _ in range(T):
n = int(input())
s = input()
p0 = -1
p1 = -1
res = [-1] * n
for i in range(n):
c = s[i]
if c == '0':
res[i] = p1
p0 = i + 1
else:
res[i] = p0
p1 = i + 1
print(" ".join(map(str, res)))
if __name__ == "__main__":
main()
第二题
题目:不能出现太多
给定n个数字A1,A2,..An,请求出这些数字中出现次数小于等于k的最小的数。
输入描述
第一行正整数n,k
接下来一行n个正整数,第i个表示Ai 1<=k<=n<=10^5,1<=Ai<=10^9
输出描述
一行一个整数,表示答案。
如果不存在出现次数少于等于k次的数字,输出-1
样例输入一
5 2
1 1 1 2 3
样例输出一
2
说明
1出现了三次,不合法;2,3均只出现了一次,其中2最小
样例输入二
8 2
1 1 4 5 7 1 3 3
样例输出二
3
参考题解
利用哈希表模拟。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
int solve(int n, int k, const vector<int>& nums) {
unordered_map<int, int> counter;
for (int num : nums) {
counter[num]++;
}
vector<int> sorted_keys;
for (const auto& pair : counter) {
sorted_keys.push_back(pair.first);
}
sort(sorted_keys.begin(), sorted_keys.end());
for (int key : sorted_keys) {
if (counter[key] <= k) {
return key;
}
}
return -1;
}
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
cout << solve(n, k, nums) << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Main {
public static int solve(int n, int k, List<Integer> nums) {
Map<Integer, Integer> counter = new HashMap<>();
for (int num : nums) {
counter.put(num, counter.getOrDefault(num, 0) + 1);
}
List<Integer> sortedKeys = new ArrayList<>(counter.keySet());
Collections.sort(sortedKeys);
for (int key : sortedKeys) {
if (counter.get(key) <= k) {
return key;
}
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
List<Integer> nums = new ArrayList<>(n);
for (int i = 0; i < n; ++i) {
nums.add(sc.nextInt());
}
System.out.println(solve(n, k, nums));
sc.close();
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
def solve(n, k, nums):
from collections impor
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

