#P3039. 字符串分割(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 221
            Accepted: 50
            Difficulty: 6
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>字符串          
 
字符串分割(100分)
思路:字符串模拟
根据题意进行模拟即可,首先需要把第一个子串单独存储,然后把后面用分隔符隔开的子串先合并成一个子串,然后再按照长度k来切分字符串(长度不足k的按照k计算),按照规则把每一段的子串进行处理即可
JavaScript代码
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let k, s;
let pos = 0;
let res = "";
rl.on('line', (line) => {
    if (k === undefined) {
        k = parseInt(line);
    } else if (s === undefined) {
        s = line;
        processInput(k, s);
        rl.close();
    }
});
function processInput(k, s) {
    while (s[pos] !== '-') {
        res += s[pos];
        pos += 1;
    }
    res += s[pos]; // 第一段不变
    let s1 = "";
    for (let i = pos + 1; i < s.length; i++) {
        if (s[i] !== '-') {
            s1 += s[i];
        }
    }
    let m = s1.length;
    let i = 0;
    while (i < m) {
        let t = "";
        if (i + k <= m) {
            t = s1.substring(i, i + k);
        } else {
            t = s1.substring(i);
        }
        let c1 = 0;
        let c = t.length;
        let c2 = 0;
        for (let ch of t) {
            if (ch >= 'a' && ch <= 'z') {
                c1 += 1;
            } else if (ch >= 'A' && ch <= 'Z') {
                c2 += 1;
            }
        }
        if (c1 > c2) {
            t = t.toLowerCase();
        }
        if (c1 < c2) {
            t = t.toUpperCase();
        }
        res += t;
        if (i + c < m) {
            res += '-';
        }
        i += k;
    }
    console.log(res);
}
Python代码
k = int(input())
s = input()
pos = 0
res = ""
while s[pos] != '-':
    res += s[pos]
    pos += 1
res += s[pos]  # 第一段不变
s1 = ""
for i in range(pos + 1, len(s)):
    if s[i] != '-':
        s1 += s[i]
m = len(s1)
i = 0
while i < m:
    t = ""
    if i + k <= m:
        t = s1[i:i + k]
    else:
        t = s1[i:]
    c1 = 0
    c = len(t)
    c2 = 0
    for ch in t:
        if ch>='a' and ch<='z':
            c1 += 1
        elif ch>='A' and ch<='Z':
            c2 += 1
    if c1 > c2:  # 小写字母比大写字母多
        t = t.lower()
    if c1 < c2:  # 大写字母比小写字母多
        t = t.upper()
    res += t
    if i + c < m:
        res += '-'  # 如果当前字符串不是最后一个字符串
    i += k
print(res)
C++代码
#include<bits/stdc++.h>
using namespace std;
int k;
string s;
int main(){
    cin>>k;
    cin>>s;
    int pos=0;
    string res;
    while(s[pos]!='-'){
        res.push_back(s[pos++]);
    }
    res.push_back(s[pos]);  //第一段 不变
    string s1;
    for(int i=pos+1;i<s.size();i++){
        if(s[i]=='-')continue;
        s1.push_back(s[i]);
    }
    int m=s1.size();
    for(int i=0;i<m;i+=k){
        string t;
        if(i+k<=m)t=s1.substr(i,k);
        else t=s1.substr(i);
        int c1=0,c=t.size(),c2=0;
        for(char &ch:t){
            if(ch>='a'&&ch<='z')c1++;
            else if(ch>='A'&&ch<='Z')c2++;
        }
        if(c1>c2){  //小写字母比大写字母多
            transform(t.begin(),t.end(),t.begin(),::tolower);
        }
        if(c1<c2){  //大写字母比小写字母多
            transform(t.begin(),t.end(),t.begin(),::toupper);
        }
        res+=t;
        if(i+c<m)res+='-';  //如果当前字符串不是最后一个字符串
        
    }
    cout<<res<<endl;
    return 0;
}
Java代码
import java.util.Scanner;
import java.util.StringJoiner;
 
public class Main {
  static int[] fact;
 
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    int k = sc.nextInt();
    String s = sc.next();
 
    System.out.println(getResult(k, s));
  }
 
  public static String getResult(int k, String s) {
    String[] arr = s.split("-");
 
    // 第一个子串不做处理
    StringJoiner sj = new StringJoiner("-");
    //    sj.add(convert(arr[0])); // 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
    sj.add(arr[0]);
 
    // 剩余子串重新合并为一个新字符串,每k个字符一组
    StringBuilder sb = new StringBuilder();
    for (int i = 1; i < arr.length; i++) sb.append(arr[i]);
    String newStr = sb.toString();
 
    for (int i = 0; i < newStr.length(); i += k) {
      String subStr = newStr.substring(i, Math.min(i + k, newStr.length()));
      // 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
      sj.add(convert(subStr));
    }
 
    return sj.toString();
  }
 
  public static String convert(String str) {
    int lowerCount = 0;
    int upperCount = 0;
 
    for (int i = 0; i < str.length(); i++) {
      char c = str.charAt(i);
      if (c >= 'a' && c <= 'z') lowerCount++;
      else if (c >= 'A' && c <= 'Z') upperCount++;
    }
 
    if (lowerCount > upperCount) return str.toLowerCase();
    else if (lowerCount < upperCount) return str.toUpperCase();
    else return str;
  }
}
        题目描述
 给定一个非空字符串,其被 N 个'-' 分隔成 N+1个字串,给定正整数 K,要求除第一个字串外,其余的子串每 K 个字符组成新的子串,并用 '-' 分隔。
 对于新组成的每一人子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母,反之,如果它含有的大写字母比小写字母多,则将这个子的所有小写字母转换为大写字母,大小写字母的数量相等时,不做转换。
输入描述
输入第一行为一个整数 K,第二行为字符串 S,1<K≤10, 1≤S的长度≤1e5, 保证字符串由可见字符组成
输出描述
输出转换后的字符串
样例1
输入
3
12abc-abcABC-4aB@
输出
12abc-abc-ABC-4aB-@
说明:
子串为 12abc 、abCABc、4aB@,第一个子串保留后面的子串每 3 个字符一组为 abC、ABc 、4aB 、@ , abC 中小写字母较多,转换为 abc , ABc 中大写字母较多,转换为 ABC , 4aB 中大小写字母都为 1 个,不做转换, @ 中没有字母,连起来即12abc-abc-ABC-4aB-@。
样例2
输入
12
12abc-abCABc-4aB@
输出
12abc-abCABc4aB@
说明:
子串为 12abc 、abCABc 、4aB@ ,第一个子串保留,后面的子串每 12 个字符组为abCABc4aB@,这个子串中大小写字母都为 4 个,不做转换,连起来即 12abc−abCABc4aB@。