字符串处理
华为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
1≤n≤1000),表示子串的长度。
输出描述
- 输出一个字符串,表示处理后的新的字符串。
样例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”
题解
思路:模拟
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, r–1 {
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;
}