2023 得物笔试题 0830

这篇博客介绍了2023年8月30日得物笔试的两道算法题目。第一题是关于判断糖葫芦串是否漂亮的,要求包含长度为X的回文子串;第二题涉及建筑高度规划,求解第x栋建筑可能的最高高度。每道题都给出了输入输出描述和样例,并提供了参考题解。
摘要由CSDN通过智能技术生成

笔试时间: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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

azierrrrrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值