笔试时间:2023年8月30日 秋招
第一题
题目:Cheems的漂亮糖葫芦
小狗Cheems在街边买到了一串糖葫芦,这串糖葫芦是由n个大写字母构成的。Cheems觉得这串糖葫芦虽然美味,却并不一定能称得上漂亮。当糖葫芦中包含了一串长度为X的连续子串,满足正序读与倒序读一模一样时(即是一串回文串),它会觉得这整串糖葫芦是漂亮的。
输入描述
第一行两个以空格隔开的正整数n和x,表示糖葫芦串长度和Cheems对于子串要求的长度。
第二行一个长为n的仅包合大写字母的字符串s,代表糖葫芦
1<=n,x<=5000
输出描述
如果这串糖葫芦是漂亮的,输出1,否则输出0。
样例输入
6 2
AACBBE
样例输出
1
提示:可以找到称在子串“AA",长度为2,且正着读与倒着读一模一样.
参考题解
C++:
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
cin.ignore();
string s;
getline(cin, s);
if (x == 1) {
cout << "1" << endl;
return 0;
}
for (int i = 0; i <= n - x; i++) {
int left = i;
int right = i + x - 1;
while (left < right) {
if (s[left] == s[right]) {
left++;
right--;
} else {
break;
}
}
if (left >= right) {
cout << "1" << endl;
return 0;
}
}
cout << "0" << endl;
return 0;
}
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
sc.nextLine();
String s = sc.nextLine();
if(x == 1){
System.out.println(1);
return;
}
for(int i = 0; i <= n - x; i++){
int left = i;
int right = i + x - 1;
while(left < right){
if(s.charAt(left) == s.charAt(right)){
left++;
right--;
}else{
break;
}
}
if(left >= right){
System.out.println(1);
return;
}
}
System.out.println("0");
}
}
Python:
n, x = map(int, input().split())
s = input()
if x == 1:
print("1")
exit()
for i in range(n - x + 1):
left = i
right = i + x - 1
while left < right:
if s[left] == s[right]:
left += 1
right -= 1
else:
break
if left >= right:
print("1")
exit()
print("0")
第二题
题目:最高的楼
市容市貌建设是一个很重要的课题,在某市的规划中有这样一条要求,位于一条街道上的相邻位置的楼的高度差不能超过1m。每栋楼的高度都是整数。某同学第一次来到这个城市,他听人提起在一条街上,有n栋连续的建筑,这些建筑的高度是m米。他想知道在这条街道上,第x栋建筑可能的最高高度是多少,不存在高度为0的建筑。也就是说这n栋建筑至少高1m。
输入描述
输入仅有一行,包含三个整数n,m,x。(1<=n<=m<=10^9,1<=x<=n)
输出描述
输出仅包含一个正整数,请你输出第*栋建筑可能的最高高度是多少。
样例输入
5 6 1
样例输出
2
提示:5个建筑物。总高6米,可以按如下分配:2 1 1 1 1,此时最高高度为2
参考题解
Java:
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long m = sc.nextLong();
long x = sc.nextLong();
long left = 1, right = m;
long ans = -1;
while(left <= right){
long mid = (left + right) / 2;
if(check(mid, x, m, n)){
left = mid + 1;
ans = mid;
}else{
right = mid - 1;
}
}
System.out.println(ans);
}
//m为总高度,n为楼的数量
public static boolean check(long height, long index, long m, long n){
long left = Math.max(1, index - height + 1);
long right = Math.min(n, index + height - 1);
long sum = Math.max(0, left - 1) + n - right + helper(height, index - left + 1) + helper(height, right - index + 1) - height;
return sum <= m;
}
public static long helper(long st, long length){
return (2 * st - length + 1) * length / 2;
}
}