字节笔试 字节笔试题 0825
笔试时间:2024年08月25日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目
小红有一个长度为n的字符串s,由0、1和 * 组成,可以把*替换成0或者1,小红想知道替换后的字符串的最短周期是多少。如果一个字符串每一个位置的字母都与后k位的字母相同,那么k即为该字符串的一个周期。形式化的说,如果存在一个正整数k 使得对于所有的 i属于[1,n - k] 都有 s[i]= s[i+k] ,那么称k是字符串s的周期。
输入描述
第一行输入一个长度为n(1<=n<=1e3),且只由0、1和*组成的字符串s。
输出描述
在一行上输出一个整数,表示替换后的字符串的最短周期。
样例输入
1*011*0*1
样例输出
4
说明
一共有六种替换方式,其中 100110011拥有最短周期。
参考题解
从1-n枚举周期,对于每一个周期k,将字符串分成多个k长度的部分,检查每一部分在相同位置上的字符是否可以相同。如果k可以作为周期,则记录最小的周期。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <set>
#include <string>
int get(const std::string& s) {
int n = s.length();
int ans = 0;
for (int i = 1; i <= n; i++) {
bool f = true;
std::vector<std::set<char>> g(i + 1);
for (int j = 0; j < n; j++) {
if (s[j] == '*') {
continue;
}
g[j % i].insert(s[j]);
}
for (int j = 0; j < i; j++) {
if (g[j].size() >= 2) {
f = false;
}
}
if (f) {
ans = i;
break;
}
}
return ans;
}
int main() {
std::string s;
std::cin >> s;
int result = get(s);
std::cout << result << std::endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Main {
public static int get(String s) {
int n = s.length();
int ans = 0;
for (int i = 1; i <= n; i++) {
boolean f = true;
List<Set<Character>> g = new ArrayList<>();
for (int j = 0; j < i + 1; j++) {
g.add(new HashSet<>());
}
for (int j = 0; j < n; j++) {
if (s.charAt(j) == '*') {
continue;
}
g.get(j % i).add(s.charAt(j));
}
for (int j = 0; j < i; j++) {
if (g.get(j).size() >= 2) {
f = false;
}
}
if (f) {
ans = i;
break;
}
}
return ans;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int result = get(s);
System.out.println(result);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
def get(s): n = len(s) ans = 0 for i in range(1, n + 1): f = True g = [set() for _ in range(i + 1)] for j in range(n): if s[j] == '*': continue g[j % i].add(s[j]) for j in range(i): if len(g[j]) >= 2: f = False if f: ans = i break return ans s = input().strip() result = get(s) print(result)
第二题
题目
二维平面上有几 个整点 a[1],a[2],·..,a[n],其中第个点的坐标为(i,a[i])。小苯想知道有多少个点对“,j满足第i个点和第j个点的连线所在的直线恰好经过原点,请你帮他算一算吧。
输入描述
第一行输入一个正整数n(2 <= n < =2e5)代表整点数量。
第二行输入n个正整数 a[1],a[2],·..,a[n]](1 <= a[i]< 1e9)代表整点的纵坐标。
输出描述
在一行上输出一个正整数,表示连线所在直线经过原点的点对个数。
样例输入
5
1 2 4 4 5
样例输出
6
参考题解
对于任意两个点(i, a[i])和(j, a[j]),若连线经过原点,则它们的斜率必须相同。斜率可以表示为a[i] / i。为了避免浮点数的精度问题,可以将斜率表示为一个最简分数 (a[i] / gcd(i, a[i]), i / gcd(i, a[i]))。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <numeric> // for gcd
using namespace std;
int get(int n, const vector<int>& a) {
map<pair<int, int>, int> ma;
int ans = 0;
for (int i = 1; i <= n; i++) {
int d = gcd(i, a[i-1]);
pair<int, int> slope = make_pair(i / d, a[i-1] / d);
ans += ma[slope];
ma[slope]++;
}
return ans;
}
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int result = get(n, a);
cout << result << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
import java.math.BigInteger;
public class Main {
public static int get(int n, int[] a) {
Map<Pair<Integer, Integer>, Integer> ma = new HashMap<>();
int ans = 0;
for (int i = 1; i <= n; i++) {
int d = gcd(i, a[i-1]);
Pair<Integer, Integer> slope = new Pair<>(i / d, a[i-1] / d);
ans += ma.getOrDefault(slope, 0);
ma.put(slope, ma.getOrDefault(slope, 0) + 1);
}
return ans;
}
public static int gcd(int a, int b) {
return BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).intValue();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
int result = get(n, a);
System.out.println(result);
}
static class Pair<U, V> {
public final U first;
public final V second;
public Pair(U first, V second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair<?, ?> pair = (Pair<?, ?>) o;
return Objects.equals(first, pair.first) && Objects.equals(second, pair.second);
}
@Override
public int
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。


查看15道真题和解析