(C卷,100分)- 字符串分割(二)(Java & JS & Python)

题目描述

给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换。

输入描述

输入为两行,第一行为参数K,第二行为字符串S。

输出描述

输出转换后的字符串。

用例

输入 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-@

输入 12
12abc-abCABc-4aB@
输出 12abc-abCABc4aB@
说明

子串为12abc、abCABc、4aB@,第一个子串保留,

后面的子串每12个字符一组为abCABc4aB@,

这个子串中大小写字母都为4个,不做转换,

连起来即12abc-abCABc4aB@

题目解析

此题应该就是考察字符串的操作能力的,只要熟练掌握字符串操作即可。

本题比较困惑的是,第一个子串是否要做大小写转换?看用例说明的意思,应该是不用做的。

下面代码中,我把大小写转换抽出成一个方法,考试时可以根据自行使用。

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;
  }
}

JS算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

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

const lines = [];
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 2) {
    let k = parseInt(lines[0]);
    let s = lines[1];
    console.log(getResult(s, k));
    lines.length = 0;
  }
});

function getResult(s, k) {
  const arr = s.split("-");

  const ans = [];
  // ans.push(convert(arr[0]));// 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
  ans.push(arr[0]);

  // 剩余子串重新合并为一个新字符串,每k个字符一组
  const newStr = arr.slice(1).join("");
  for (let i = 0; i < newStr.length; i += k) {
    const subStr = newStr.slice(i, i + k);
    // 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
    ans.push(convert(subStr));
  }

  return ans.join("-");
}

function convert(s) {
  let lowerCount = 0;
  let upperCount = 0;

  for (let i = 0; i < s.length; i++) {
    if (s[i] >= "a" && s[i] <= "z") lowerCount++;
    else if (s[i] >= "A" && s[i] <= "Z") upperCount++;
  }

  if (lowerCount > upperCount) return s.toLowerCase();
  else if (lowerCount < upperCount) return s.toUpperCase();
  else return s;
}

Python算法源码

# 输入获取
k = int(input())
s = input()


def convert(s):
    lowerCount = 0
    upperCount = 0

    for c in s:
        if 'z' >= c >= 'a':
            lowerCount += 1
        elif 'Z' >= c >= 'A':
            upperCount += 1

    if lowerCount > upperCount:
        return s.lower()
    elif lowerCount < upperCount:
        return s.upper()
    else:
        return s


# 算法入口
def getResult():
    arr = s.split("-")

    ans = []
    # ans.append(convert(arr[0])) # 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
    ans.append(arr[0])

    # 剩余子串重新合并为一个新字符串,每k个字符一组
    newStr = "".join(arr[1:])
    for i in range(0, len(newStr), k):
        subStr = newStr[i:i + k]
        # 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
        ans.append(convert(subStr))

    return "-".join(ans)


# 算法调用
print(getResult())

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?