赛码网编程题--打字(Java全A)

发布时间 2023-09-27 19:41:05作者: 万里阳光号船长

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

输入描述
第一行一个T,表示有T组输入。
接下来T组数据:
每组数据一个字符串s,s的长度小于等于100。仅包含大小写字母。

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

样例输入

3
A
AA
AAAAAA

样例输出

2
3
7

解题思路

  • 用变量small表示键入当前字符后并保持输入状态为小写字母,所需的最小次数。若当前字符为大写,则新的small应从(旧的small + 1次shift键 + 1次字母键)和(旧的big + 1次CapsLock键 + 1次字母键)中取较小值。其他情况依次类推。
  • 用变量big表示键入当前字符后并保持输入状态为大写字母,所需的最小次数。

代码

import java.util.*;

class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = Integer.parseInt(sc.nextLine());
    for (int i = 0; i < n; i++) {
      String str = sc.nextLine();
      int len = str.length();
      //初始状态为小写字母,故big为1
      int small = 0, big = 1;
      for (int j = 0; j < len; j++) {
        char c = str.charAt(j);
        if (c >= 'A' && c <= 'Z') {
          int val1 = Math.min(small + 2, big + 2);
          int val2 = Math.min(small + 2, big + 1);
          small = val1;
          big = val2;
        }
        else {
          int val1 = Math.min(small + 1, big + 2);
          int val2 = Math.min(small + 2, big + 2);
          small = val1;
          big = val2;
        }
      }
      System.out.println(Math.min(small, big));
    }
  }
}