题目

时间限制: 3000MS
内存限制: 589824KB

题目描述:

小明很喜欢打字,今天小红给了小明一个字符串。
这个字符串只包含大写和小写字母。
我们知道,按下CapsLock键,可以切换大小写模式。
我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。
在大写模式的时候,按下shift+字母键,就能写出小写字母。
现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?
注意,按shift和字母键,算两次按键。开始时均为小写状态。

感觉代码没有问题,但赛码网提示只有9%AC。不知道因为什么?

太晚了,改天再分析。

输入描述
第一行一个T,表示有T组输入。

接下来T组数据:

每组数据一个字符串s,s的长度小于等于100。仅包含大小写字母。

输出描述
对于每组数据,输出最少按键次数。

样例输入

3
A
AA
AAAAAA

样例输出

2
3
7

import java.util.Scanner;/*** @author songquanheng* 2022/1/25-22:01*/
public class Huiwen {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n =  scanner.nextInt();for (int i=0; i<n; i++) {String str = scanner.next();System.out.println(click(str));}}public static int click(String str) {boolean lowercaseMode = true;int click = 0;char[] chars = str.toCharArray();for (int i = 0; i < chars.length; i++) {char ch = chars[i];if (i == chars.length - 1) {if ((lowercaseMode && Character.isLowerCase(ch)) || (!lowercaseMode &&Character.isUpperCase(ch))) {click++;continue;} else {click += 2;continue;}}char nextChar = chars[i + 1];if (lowercaseMode) {if (Character.isLowerCase(ch)) {click++;continue;}if (Character.isUpperCase(ch) && Character.isLowerCase(nextChar)) {// 不切换大小写模式click += 2;continue;}if (Character.isUpperCase(ch) && Character.isUpperCase(nextChar)) {click += 2;lowercaseMode = false;}} else {if (Character.isUpperCase(ch)) {click++;continue;}if (Character.isLowerCase(ch) && Character.isUpperCase(nextChar)) {// 不切换大小写click += 2;continue;}if (Character.isLowerCase(ch) && Character.isLowerCase(nextChar)) {click += 2;lowercaseMode = true;}}}return click;}/*** 在字符串头部或者尾部添加1个字符串,判断能否成为回文字符串** @param text 待判断的字符串* @return*/public static boolean canBecomeHuiweb(String text) {int i = 0;char[] chars = text.toCharArray();while (chars[i] == chars[chars.length - 1 - i] && i<(chars.length-1)/2) {i++;}text = text.substring(i, text.length() - i);String substring = text.substring(0, 1);String subString2 = text.substring(text.length() - 1, text.length());String res = text + substring;return isHuiweb(res) || isHuiweb(subString2 + text);}public static boolean isHuiweb(String text) {char[] chars = text.toCharArray();StringBuilder stringBuilder = new StringBuilder();for (int i = chars.length - 1; i >= 0; i--) {stringBuilder.append(chars[i]);}String res = stringBuilder.toString();return res.equals(text);}
}

===
这道题目让我有点崩溃,周六花了两个小时,还是没有做出AC的程序。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int groups = scanner.nextInt();for (int i = 0; i < groups; i++) {String input = scanner.next();System.out.print(new Main().minimalKey(input));System.out.println();}}private int minimalKey(String input) {// 键入次数int count = 0;boolean lowerMode = true;List<Record> records = getRecords(input);for (int i = 0; i < records.size(); i++) {Record record = records.get(i);if (same(byMode(lowerMode), record.getaChar())) {// 大小写模式与待处理的记录相同count += record.getNumber();continue;}// 处理大小写模式与待处理记录不相同的情形if (record.getNumber() > 1) {// 点击capslockcount += record.getNumber();count += 1;lowerMode = !lowerMode;} else {count += 2;// 通过shift进行键入if (i == records.size() - 1) {} else {}}}return count;}/*** 获取相同大小写的统计** @param input 输入的字符串* @return*/private List<Record> getRecords(String input) {List<Record> records = new ArrayList<>();Character current = null;int cnt = 1;if (input.length() == 0) {return records;}if (input.length() == 1) {records.add(new Record(byCurrent(input.charAt(0)), 1));return records;}for (int i = 0; i < input.length(); i++) {if (current == null) {current = input.charAt(i);continue;}// 统计相同大小写的个数// 注意: 退出while循环的条件是第i个字符与当前不同或者i与长度相同while (i < input.length() && same(current, input, i)) {cnt++;i++;}records.add(new Record(byCurrent(current), cnt));if (i < input.length()) {// 这表明same函数为假current = negateCurrent(current);cnt = 1;}// 处理AAAA或者aaa这种最后的连续的情况,相当于边界情况if (i == input.length() - 1) {records.add(new Record(byCurrent(current), cnt));}}return records;}private char byCurrent(Character current) {if (Character.isLowerCase(current)) return 'a';else return 'A';}private char byMode(boolean lowerMode) {if (lowerMode) {return 'a';} else {return 'A';}}private char negateCurrent(Character current) {if (Character.isLowerCase(current)) return 'A';else return 'a';}private boolean same(Character current, String input, int i) {char ch = input.charAt(i);return same(current, ch);}private boolean same(Character current, char ch) {boolean bothLower = Character.isLowerCase(current) && Character.isLowerCase(ch);boolean bothUpper = Character.isUpperCase(current) && Character.isUpperCase(ch);return bothLower || bothUpper;}}class Record {private char aChar;private int number;public Record(char aChar, int number) {this.aChar = aChar;this.number = number;}public char getaChar() {return aChar;}public void setaChar(char aChar) {this.aChar = aChar;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}@Overridepublic String toString() {return "Record{" +"aChar=" + aChar +", number=" + number +'}';}
}

赛码网: 小明很喜欢打字,今天小红给了小明一个字符串。相关推荐

  1. 赛码网,股神问题,用C语言自己实现的一个程序,仅供参考

    题目描述有股神吗?有,小赛就是!经过严密的计算,小赛买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天...依此类推.为方便计算 ...

  2. 赛码网编程题---打字(C++)

    题目描述 小明很喜欢打字,今天小红给了小明一个字符串.这个字符串只包含大写和小写字母. 我们知道,按下CapsLock键,可以切换大小写模式.我们在小写模式时候,同时按下shift+字母键,就能写出大 ...

  3. 赛码网输入输出总结+真题演练

    赛码网输入输出总结 前言 类型一:测试组数不固定,每组三行数据 踩坑记录1 踩坑记录2 类型2 测试组数不定,输入数据中有指定行数的多行输入(赛码网找老乡题最完美答案) 类型三:一组数据,有指定行数的 ...

  4. 赛码网算法: 上台阶 ( python3实现 、c实现)

    上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=1 ...

  5. 牛客网赛码网 输入输出格式

    目录 牛客网&赛码网输入输出 牛客网 单行输入 多行输入,每一行是一个测试样例 多个测试用例,每个测试用例有多行 赛码网 单个输入,单个输出 单行多个输入,单行多个输出,空格分割 多个测试案例 ...

  6. 牛客网赛码网 输入输出格式 pythonC++

    牛客网&赛码网 输入输出格式 python&C++ Note: 你的程序需要stdin(标准输入)读取输入,然后stdout(标准输出)来打印结果,举个例子,你可以使用c语言的scan ...

  7. 【赛码网 牛客网】输入输出总结(python版)

    1. 单行输入 n, m = map(int, sys.stdin.readline().strip().split()) 对该行中所有元素取整型后赋给等式左边若干参数 2. 多行输入: 先获取第一行 ...

  8. 牛客网赛码网输入输出总结(python版)

    1. 单行输入: n, m = map(int, sys.stdin.readline().strip().split()) 对该行中所有元素取整型后赋给等式左边若干参数 2. 多行输入: 先获取第一 ...

  9. js牛客网、赛码网输入输出

    js牛客网.赛码网输入输出 牛客网在线判题系统JavaScript(V8)使用 输入 单行输入 只有一行输入或者一个 var line = read_line(); 只有一行数组 var line = ...

最新文章

  1. GAN网络生成:感知损失(Perceptual Losses)
  2. 安装Maltego默认插件
  3. (转载)C#:Enum、Int和String的互相转换,枚举转换
  4. python利用自动识别写模块_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...
  5. 数据结构之中缀表达式实现计算器
  6. 不加载,手动实例化Service
  7. SIFT特征检测算子和sift = cv2.xfeatures2d.SIFT_create出错的解决办法
  8. C++落选,2021年最想学习的五大编程语言
  9. js日期函数表达天,时,分,秒
  10. LaTeX数学符号大全(转载)
  11. 虚拟机Ubuntu设置屏幕分辨率
  12. deepin安装教程(deepin安装教程不用u盘)
  13. 安卓游戏广告加速插件_Pokemon Go游戏加速器 安卓/IOS客户端 使用方法
  14. openwrt + dnsmasq + anti-AD 两步搞定广告屏蔽
  15. UVA - 11604 General Sultan 题解
  16. 虚拟机与Java虚拟机
  17. 选点问题(贪心算法)
  18. 计算机网络:网络安全
  19. kubernetes中infra容器的理解
  20. 理科生应该这样写情书

热门文章

  1. Python:元组使用
  2. Corn fields(玉米田)状压dp入门第一题 洛谷P1879 poj3254
  3. 如何用foobar200转换无损wma!
  4. Game Plug-ins(2)
  5. 全球与中国网络性能监控工具市场现状及未来发展趋势
  6. iMeta和CGM联合报告:中科院生态中心邓晔-气候变化驱动核心微生物的迁移(5.4晚8点)...
  7. Web网站模板-小清新企业个人营销宣传响应式网站模板(HTML+CSS+JavaScript)
  8. RGB与Lab颜色空间互相转换
  9. 平价的无线蓝牙耳机,性价比高的无线蓝牙耳机
  10. 2022,再见,2023,我来了!