欢迎光临
我们一直在努力

华为OD机试新系统真题-字符串处理(C/C++/Py/Java/Js/Go)

字符串处理

华为OD机试新系统真题 华为OD上机考试新系统真题 6月17号 100分题型

华为OD机试新系统真题目录点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解

题目内容

给定一个字符串

s

s

s,以及字符串子串的长度

n

n

n,要求:

  • s

    s

    s 按照

    n

    n

    n 的长度进行字符串子串拆分;

  • 每个子串不允许出现重复的字符,如果出现,则保留最后一个,例如 “

    a

    b

    a

    aba

    aba” 处理后会变成 “

    b

    a

    ba

    ba”,因为第一个 ‘

    a

    a

    a’ 出现重复,因此第一个 ‘

    a

    a

    a’ 被删除,保留了最后一个 ‘

    a

    a

    a’;

  • 字符串

    s

    s

    s 的长度不一定恰好是

    n

    n

    n 的倍数,最后一个数据包可能少于

    n

    n

    n 个字符,但处理规则不变; 最后把所有子串再次拼接,输出一个新的字符串。

  • 输入描述

    • 第一行输入一个字符串

      s

      s

      s,字符串不为空且仅包含小写字母,长度不超过

      1000

      1000

      1000

    • 第二行输入一个整数

      n

      n

      n (

      1

      n

      1000

      1 \\le n \\le 1000

      1n1000),表示子串的长度。

    输出描述

    • 输出一个字符串,表示处理后的新的字符串。

    样例1

    输入

    abaabacbda
    3

    输出

    babacbda

    说明 原始字符串分成

    4

    4

    4 个子串: “

    a

    b

    a

    aba

    aba”、“

    a

    b

    a

    aba

    aba”、“

    c

    b

    d

    cbd

    cbd”、“

    a

    a

    a”。

    • a

      b

      a

      aba

      aba” 处理为 “

      b

      a

      ba

      ba

    • a

      b

      a

      aba

      aba” 处理为 “

      b

      a

      ba

      ba

    • c

      b

      d

      cbd

      cbd” 处理为 “

      c

      b

      d

      cbd

      cbd

    • a

      a

      a” 处理为 “

      a

      a

      a” 拼接得到 “

      b

      a

      ba

      ba

      +

      +

      +

      b

      a

      ba

      ba

      +

      +

      +

      c

      b

      d

      cbd

      cbd

      +

      +

      +

      a

      a

      a

      =

      =

      =

      b

      a

      b

      a

      c

      b

      d

      a

      babacbda

      babacbda”。

    样例2

    输入

    aaabbb
    2

    输出

    aabb

    说明 原始字符串分成

    3

    3

    3 个子串: “

    a

    a

    aa

    aa”、“

    a

    b

    ab

    ab”、“

    b

    b

    bb

    bb”。

    • a

      a

      aa

      aa” 处理为 “

      a

      a

      a

    • a

      b

      ab

      ab” 处理为 “

      a

      b

      ab

      ab

    • b

      b

      bb

      bb” 处理为 “

      b

      b

      b

      "

      拼接得到

      "

      " 拼接得到 "

      "拼接得到"a

      "

      "

      "+

      "

      "

      "ab

      "

      "

      "+

      "

      "

      "b

      "

      "

      "=

      "

      "

      "aabb$”。

    样例3

    输入

    a
    1

    输出

    a

    说明 只有

    1

    1

    1 个字符,结果为 “

    a

    a

    a

    样例4

    输入

    a
    1000

    输出

    a

    说明 只有

    1

    1

    1 个字符,结果为 “

    a

    a

    a

    题解

    思路:模拟

  • 按照从前往后将原始字符串按照n长度进行切割子串,如果s.size() % n != 0, 最后一组长度为s.size() %n
  • 对于每个子串字符去重,只保留最后一个重复字符,可以从后往前进行遍历字符,同时通过布尔数组只保留首次出现的字符。
  • 按照1、2对子串切割并去除重复字符之后,按顺序将每个去重后子串进行拼接即可。
  • c++

    #include <algorithm>
    #include<bits/stdc++.h>
    #include <vector>
    using namespace std;

    string processStr(string& s, int n) {
    vector<string> ans;
    int m = s.size();
    for (int i = 0; i < m; i += n) {
    string subStr = s.substr(i, n);
    string part;
    // 进行去重处理
    vector<bool> vis(26, false);
    for (int j = subStr.size() – 1; j>=0; j–) {
    char c = subStr[j];
    if (vis[c – 'a']) {
    continue;
    }
    part.push_back(c);
    vis[c – 'a'] = true;
    }
    // 反转
    reverse(part.begin(), part.end());
    ans.push_back(part);
    }
    // 拼接结果
    string res;
    for (auto & s : ans) {
    res += s;
    }
    return res;
    }

    int main() {
    string s;
    int n;
    cin >> s;
    cin >>n;
    cout << processStr(s, n);
    return 0;
    }

    Java

    import java.util.*;

    public class Main {

    public static String processStr(String s, int n) {
    List<String> ans = new ArrayList<>();
    int m = s.length();

    for (int i = 0; i < m; i += n) {
    String subStr = s.substring(i, Math.min(i + n, m));
    StringBuilder part = new StringBuilder();

    // 进行去重处理
    boolean[] vis = new boolean[26];

    for (int j = subStr.length() 1; j >= 0; j) {
    char c = subStr.charAt(j);
    if (vis[c 'a']) {
    continue;
    }
    part.append(c);
    vis[c 'a'] = true;
    }

    // 反转
    part.reverse();
    ans.add(part.toString());
    }

    // 拼接结果
    StringBuilder res = new StringBuilder();
    for (String str : ans) {
    res.append(str);
    }

    return res.toString();
    }

    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String s = sc.next();
    int n = sc.nextInt();

    System.out.print(processStr(s, n));
    }
    }

    Python

    def process_str(s, n):
    ans = []
    m = len(s)

    for i in range(0, m, n):
    sub_str = s[i:i + n]
    part = []

    # 进行去重处理
    vis = [False] * 26

    for j in range(len(sub_str) 1, 1, 1):
    c = sub_str[j]
    if vis[ord(c) ord('a')]:
    continue

    part.append(c)
    vis[ord(c) ord('a')] = True

    # 反转
    part.reverse()
    ans.append("".join(part))

    # 拼接结果
    return "".join(ans)

    s = input().strip()
    n = int(input().strip())

    print(process_str(s, n))

    JavaScript

    const readline = require('readline');

    const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
    });

    const input = [];

    rl.on('line', (line) => {
    input.push(line.trim());
    });

    rl.on('close', () => {
    const s = input[0];
    const n = parseInt(input[1]);

    console.log(processStr(s, n));
    });

    function processStr(s, n) {
    const ans = [];
    const m = s.length;

    for (let i = 0; i < m; i += n) {
    const subStr = s.substring(i, i + n);
    const part = [];

    // 进行去重处理
    const vis = new Array(26).fill(false);

    for (let j = subStr.length 1; j >= 0; j) {
    const c = subStr[j];

    if (vis[c.charCodeAt(0) 'a'.charCodeAt(0)]) {
    continue;
    }

    part.push(c);
    vis[c.charCodeAt(0) 'a'.charCodeAt(0)] = true;
    }

    // 反转
    part.reverse();
    ans.push(part.join(''));
    }

    // 拼接结果
    return ans.join('');
    }

    Go

    package main

    import (
    "bufio"
    "fmt"
    "os"
    "strings"
    )

    func processStr(s string, n int) string {
    ans := make([]string, 0)
    m := len(s)

    for i := 0; i < m; i += n {
    end := i + n
    if end > m {
    end = m
    }

    subStr := s[i:end]
    part := make([]byte, 0)

    // 进行去重处理
    vis := make([]bool, 26)

    for j := len(subStr) 1; j >= 0; j {
    c := subStr[j]

    if vis[c'a'] {
    continue
    }

    part = append(part, c)
    vis[c'a'] = true
    }

    // 反转
    for l, r := 0, len(part)1; l < r; l, r = l+1, r1 {
    part[l], part[r] = part[r], part[l]
    }

    ans = append(ans, string(part))
    }

    // 拼接结果
    return strings.Join(ans, "")
    }

    func main() {
    in := bufio.NewReader(os.Stdin)

    var s string
    var n int

    fmt.Fscan(in, &s)
    fmt.Fscan(in, &n)

    fmt.Print(processStr(s, n))
    }

    C语言

    #include <stdio.h>
    #include <string.h>
    #include <stdbool.h>

    char result[100005];

    void processStr(char *s, int n) {
    int m = strlen(s);
    int resPos = 0;

    for (int i = 0; i < m; i += n) {
    int len = n;
    if (i + len > m) {
    len = m i;
    }

    char part[27];
    int partLen = 0;

    // 进行去重处理
    bool vis[26] = {false};

    for (int j = len 1; j >= 0; j) {
    char c = s[i + j];

    if (vis[c 'a']) {
    continue;
    }

    part[partLen++] = c;
    vis[c 'a'] = true;
    }

    // 反转
    for (int l = 0, r = partLen 1; l < r; l++, r) {
    char temp = part[l];
    part[l] = part[r];
    part[r] = temp;
    }

    // 拼接结果
    for (int j = 0; j < partLen; j++) {
    result[resPos++] = part[j];
    }
    }

    result[resPos] = '\\0';
    }

    int main() {
    char s[100005];
    int n;

    scanf("%s", s);
    scanf("%d", &n);

    processStr(s, n);

    printf("%s", result);

    return 0;
    }

    赞(0)
    未经允许不得转载:171主机测评 » 华为OD机试新系统真题-字符串处理(C/C++/Py/Java/Js/Go)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址