2023 携程笔试 携程笔试题 0921

笔试时间:2023年9月19日 秋招

第一题

题目

游游拿到了一个排列a。她希望你构造一个长度相等的排列b,满足ai≠bi且b的字典序尽可能小。你能帮帮她吗?所谓排列,即长度为n的数组,其中 1到n每个正整数都恰好出现了 1次。

输入描述

第一行输入一个正整数n,代表排列a的长度。

第二行输入几个正整数ai,代表游游拿到的排列。

2<=n<=10^5

输出描述

n个正整数bi,代表构造的排列。

样例输入

3

1 2 3

样例输出

2 3 1

参考题解

贪心。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>

int main() {
    int n;
    std::cin >> n;

    std::vector<int> a(n);
    std::vector<int> b(n);

    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
        b[i] = i + 1;
    }

    for (int i = 0; i < n - 1; i++) {
        if (b[i] == a[i]) {
            std::swap(b[i], b[i + 1]);
        }
    }

    if (a[n - 1] == b[n - 1]) {
        std::swap(b[n - 1], b[n - 2]);
    }

    for (int i = 0; i < n; i++) {
        std::cout << b[i];
        if (i < n - 1) {
            std::cout << ' ';
        } else {
            std::cout << std::endl;
        }
    }

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];

        for (int i = 0; i < n; i++) {
            a[i] = scanner.nextInt();
            b[i] = i + 1;
        }

        for (int i = 0; i < n - 1; i++) {
            if (b[i] == a[i]) {
                int temp = b[i];
                b[i] = b[i + 1];
                b[i + 1] = temp;
            }
        }

        if (a[n - 1] == b[n - 1]) {
            int temp = b[n - 1];
            b[n - 1] = b[n - 2];
            b[n - 2] = temp;
        }

        for (int i = 0; i < n; i++) {
            System.out.print(b[i]);
            if (i < n - 1) {
                System.out.print(" ");
            } else {
                System.out.println();
            }
        }
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

n = int(input())
a = list(map(int, input().split()))
b = list(range(1, n + 1))

for i in range(n - 1):
    if b[i] == a[i]:
        b[i], b[i + 1] = b[i + 1], b[i]

if a[-1] == b[-1]:
    b[-1], b[-2] = b[-2], b[-1]

print(*b)

第二题

题目

小红拿到了一个字符串s。她可以进行任意次以下操作:选择字符串中的一个字母ch1和任意一个字母ch2 (ch2可以不在字符串中出现),将字符串S中的所有ch1变成ch2。小红想知道,自己能否通过一些操作将字符串s变成t?

输入描述

第一行输入一个正整数q,代表查询次数;

对于每次查询输入2行:第一行输入一个字符串s;第二行输入一个字符串t;

1<=q<=10,保证s和t的长度相同,且均由小写字母组成。长度不超过10000。

输出描述

输出q行,每行输出一个字符串代表答案。如果可以把s变成t,则输出Yes。否则输出No。

样例输入

3

ab

ba

abc

aaa

aaaa

abcd

样例输出

Yes

Yes

No

参考题解

字符串的转化,需要用到t不存在的那一个字符作为媒介才能够顺利进行各种转换。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <map>
#include <set>
#include <vector>

using namespace std;

bool isPossibleToTransform(string s, string t) {
    // Create a map to store the positions of each character in s
    map<char, vector<int> > charPositions;

    // Populate charPositions
    for (int i = 0; i < s.size(); i++) {
        charPositions[s[i]].push_back(i);
    }

    // Create a set of characters from string t
    set<char> uniqueChars(t.begin(), t.end());

    // If t contains all 26 letters, s must be equal to t
    if (uniqueChars.size() == 26) {
        return s == t;
    }

    // Check if characters in s can be transformed into t
    for (auto &[character, positions] : charPositions) {
        for (int i = 0; i + 1 < positions.size(); i++) {
            // If there are different characters at the same position in t, return false
            if (t[positions[i + 1]] != t[positions[i]]) {
                return false;
            }
        }
    }

    return true;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        string s, t;
        cin >> s >> t;
        cout << (isPossibleToTransform(s, t) ? "Yes" : "No") << endl;
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;
import java.io.*;

public class Main {
    public static boolean isPossibleToTransform(String s, String t) {
        Map<Character, List<Integer>> charPositions = new HashMap<>();

        for (int i = 0; i < s.length(); i++) {
            char character = s.charAt(i);
            charPositions.computeIfAbsent(character, k -> new ArrayList<>()).add(i);
        }

        Set<Character> uniqueChars = new Has

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

更多
牛客网
牛客企业服务