携程笔试 携程笔试题 0905
笔试时间:2024年09月05日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目
游游有两个整数n,k, 他希望构造出一个1~n的排列p, 需要p的最长上升子序列长度为k, 并且p是所有满足要求的排列中字典序最小的。最长上升子序列是一个序列中最长的严格单调递增的子序列。
输入描述
两个正整数n,k,用空格隔开。
输出描述
输出n个正整数,代表构造的排列。
样例输入
5 3
样例输出
1 2 5 4 3
参考题解
模拟。由于字典序要求最小,因此要贪心的考虑。容易想到首先构造出1, 2, 3, ..., k - 1,n, n - 1, ..., k是字典序最小的。
C++:[此代码未进行大量数据的测试,仅供参考]
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int i = 0; i < k - 1; i++) {
a[i] = i + 1;
}
a[k - 1] = n;
for (int i = k, x = n - 1; i < n; i++, x--) {
a[i] = x;
}
for (int x : a) {
cout << x << " ";
}
cout << "\n";
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
Vector<Integer> a = new Vector<>(n);
for (int i = 0; i < k - 1; i++) {
a.add(i + 1);
}
a.add(n);
for (int i = k, x = n - 1; i < n; i++, x--) {
a.add(x);
}
for (int x : a) {
System.out.print(x + " ");
}
System.out.println();
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n, k = map(int, input().split())
a = [0] * n
for i in range(k - 1):
a[i] = i + 1
a[k - 1] = n
x = n - 1
for i in range(k, n):
a[i] = x
x -= 1
print(" ".join(map(str, a)))
第二题
题目
一个长度为k的二进制字符串(下标从1开始)的权值定义如下:每次操作可以选择一个下标i(1 ≤ i ≤ k),将[1, i]中的字符全部取反(0变成1,1变成0),字符串的权值为将字符串变成全1所需要的最小操作次数。给定一个长度为n的01字符串,问:有多少个长度为奇数并且权值为奇数的子字符串?
输入描述
第一行输入一个正整数n,代表字符串的长度。第二行输入字符串S。
输出描述
输出包含一行一个整数,表示长度和权值都是奇数的非空子串数量。
样例输入
5
01010
样例输出
6
参考题解
动态规划。定义三维dp数组,第一个维度表示下标,第二个维度表示长度是奇数还是偶数,第三个维度表示权值是奇数还是偶数
例如:dp[i][0][0]就表示以下标i结尾的长度为偶数并且权值为偶数的子字符串的数量,dp[i][0][1]表示以下标i结尾的长度为偶数的权值为奇数的子字符串的数量,以此类推。
C++:[此代码未进行大量数据的测试,仅供参考]
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
int n;
cin >> n;
string s;
cin >> s;
vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(2, 0)));
long long ans = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
dp[i][1][0]++;
if (i > 0) {
dp[i][0][0] += dp[i - 1][1][0];
dp[i][0][1] += dp[i - 1][1][1];
dp[i][1][0] += dp[i - 1][0][0];
dp[i][1][1] += dp[i - 1][0][1];
}
}else {
dp[i][1][1]++;
if (i > 0) {
if (s[i - 1] == s[i]) {
dp[i][0][0] += dp[i - 1][1][0];
dp[i][0][1] += dp[i - 1][1][1];
dp[i][1][0] += dp[i - 1][0][0];
dp[i][1][1] += dp[i - 1][0][1];
} else {
dp[i][0][0] += dp[i - 1][1][0];
dp[i][0][1] += dp[i - 1][1][1];
dp[i][1][0] += dp[i - 1][0][0];
dp[i][1][1] += dp[i - 1][0][1];
}
}
}
ans += dp[i][1][1];
}
cout << ans << "\n";
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
import java.util.Vector;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String s = scanner.next();
int[][][] dp = new int[n][2][2];
long ans = 0;
for (int i = 0; i < n; i++) {
if (s.charAt(i) == '1') {
dp[i][1][0]++;
if (i > 0) {
dp[i][0][0] += dp[i - 1][1][0];
dp[i][0][1] += dp[i - 1][1][1];
dp[i][1][0] += dp[i - 1][0][0];
dp[i][1][1] += dp[i - 1][0][1];
}
} else {
dp[i][1][1]++;
if (i > 0) {
if (s.charAt(i - 1) == s.charAt(i)) {
dp[i][0][0] += dp[i - 1][1][0];
dp[i][0][1] += dp[i - 1][1][1];
dp[i][1][0] += dp[i - 1][0][0];
dp[i][1][1] += dp[i - 1][0][1];
} else {
dp[i][0][0] += dp[i - 1][1][0];
dp[i][0][1] += dp[i - 1][1][1];
dp[i][1][0] += dp[i - 1][0][0];
dp[i][1][1] += dp[i - 1][0][1];
}
}
}
ans += dp[i][1][1];
}
System.out.println(ans);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input())
s = input()
dp = [[[0, 0] for _ in range(2)] for _ in range(n)]
ans = 0
for i in range(n):
if s[i] == '1':
dp[i][1][0] += 1
if i > 0:
dp[i][0][0] += dp[i - 1][1][0]
dp[i][0][1] += dp[i - 1][1][1]
dp[i][1][0] += dp[i - 1][0][0]
dp[i][1][1] += dp[i - 1][0][1]
else:
dp[i][1][1] += 1
if i > 0:
if s[i - 1] == s[i]:
dp[i][0][0] += dp[i - 1][1][0]
dp[i][0][1] += dp[i - 1][1][1]
dp[i][1][0] += dp[i - 1][0][0]
dp[i][1][1] += dp[i - 1][0][1]
else:
dp[i][0][0] += dp[i - 1][1][0]
dp[i][0][1] += dp[i - 1][1][1]
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
查看7道真题和解析