赛码网 打字/最优打字策略 Python3

题目:
时间限制: 3000MS
内存限制: 589824KB
题目描述:

小明很喜欢打字,今天小红给了小明一个字符串。

这个字符串只包含大写和小写字母。

我们知道,按下CapsLock键,可以切换大小写模式。

我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。

在大写模式的时候,按下shift+字母键,就能写出小写字母。

现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?

注意,按shift和字母键,算两次按键。开始时均为小写状态。

输入描述:

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

接下来T组数据:

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

输出描述:

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

示例:
输入:
3
A
AA
AAAAAA
输出
2
3
7
跟京东2020年春招测开笔试题基本一致,只是输入输出的问题,但是不知道为什么就是只能AC 9%。同样的函数在赛码的京东笔试题上就可以AC 100%。烦躁。代码贴在这里了,有时间再来看看怎么回事吧。
def pressnum(l):
    flag, res, n = 0, 0, len(l)
    for i in range(n):
        if (l[i].islower() and flag == 0) or (l[i].isupper() and flag == 1):
            res += 1
        elif (l[i].islower() and flag == 1) or (l[i].isupper() and flag == 0):
            if i + 1 <= n - 1:
                if (l[i].islower() and l[i+1].islower()) or (l[i].isupper() and l[i+1].isupper()):
                    res += 2
                    flag = 1 - flag
                else:
                    res += 2
            else:
                res += 2
    return res
T = int(input())
l = []
for i in range(T):
    l.append(input())
for i in range(T):
    cur = pressnum(l[i])
    print(cur)
另外附上AC 100%的京东测开题目原题和源代码:
时间限制: 3000MS
内存限制: 589824KB
题目描述:

在英文的输入中,我们经常会遇到大小写切换的问题,频繁切换大小写会增加我们的按键次数,也会降低我们的打字效率。

众所周知,切换大小写有两种方式,一种是按下“caps locks”,也就是大写锁定键,这样一来,之后的输入模式都会被切换。另一种是同时按下shift和需要打印的字母,可以临时切换大小写(算作按下两个键)。

已知初始状态下,打字模式是小写,现在给出需要打印的字符串(区分大小写),请你计算出最少需按键多少次才能打印出来。



输入描述

输入第一行仅包含一个正整数n,表示字符串的长度(1<=n<=1000000)。

输入第二行包含一个长度为n的字符串,仅包含大小写字母。

输出描述

输出仅包含一个正整数,即最少的按键次数。

 def pressnum(l):
    flag, res, n = 0, 0, len(l)
    for i in range(n):
        if (l[i].islower() and flag == 0) or (l[i].isupper() and flag == 1):
            res += 1
        elif l[i].islower() and flag == 1:
            if i + 1 <= n - 1:
                if l[i+1].islower():
                    res += 2
                    flag = 0
                else:
                    res += 2
            else:
                res += 2
        elif l[i].isupper() and flag == 0:
            if i + 1 <= n - 1:
                if l[i+1].isupper():
                    res += 2
                    flag = 1
                else:
                    res += 2
            else:
                res += 2
    return res
n = int(input())
l = input()
cur = pressnum(l)
print(cur)
啊,到底是为什么啊~


#赛码##刷题#
全部评论
其他字符算一个,贴下我的 #include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; void getStringCount(string content){ bool isCharUpper = false; int count = 0; for(int i = 0;i < content.length();++i){ // if(!isalpha(content[i])) return;///非字母跳出 if(islower(content[i]) && isCharUpper){ if(i + 1 < content.length() && islower(content[i + 1])){ isCharUpper = false; count += 1;///按下caps }else{ count += 1;///按下shift } }else if(isupper(content[i]) && !isCharUpper){ if(i + 1 < content.length() && isupper(content[i + 1])){ isCharUpper = true; count += 1;///按下caps }else{ count += 1;///按下shift } } count += 1; } cout << count << endl; } int main() { int n; cin>>n; for(int i = 0;i < n;++i){ string str; cin>>str; getStringCount(str); } } </sstream></string></vector></iostream>
点赞 回复 分享
发布于 2023-03-06 22:14 上海
这题题干说的是输入只有大小写字母,我这边做了判断,实际测试数据里面估计还有除了字母的字符,也要计算,我去掉字母的判断就AC了
点赞 回复 分享
发布于 2023-03-06 16:22 江苏

相关推荐

05-14 16:55
广州大学 Java
面试情况25届双非本科,有&nbsp;ACM&nbsp;竞赛经历,两段实习(小厂&nbsp;+&nbsp;独角兽)。以下为2024年11月到次年5月的春招及其补录面试情况,若对个人秋招经历感兴趣,可查看另一篇置顶文章。通过某区级供水国企汇丰科技:线上行为测评&nbsp;→&nbsp;Coding&nbsp;测试&nbsp;→&nbsp;线下技术&nbsp;&amp;&nbsp;HR&nbsp;面东方财富:一、二轮线上面,三轮线下技术面招银科技:一轮线上技术,二轮、三轮线下技术和HR元戎启行:三轮技术面&nbsp;+&nbsp;HR&nbsp;面,一共四面面试挂拼多多:客户端,三轮技术面挂,手撕没撕出来4399:一轮技术面挂微派:一轮技术面挂,手撕没撕出来以下是个人无意向故提前主动终止流程,以免影响其他候选人广州农商银行:线下笔试,一轮面试...
isjsns:同双非本,最后的总结那块挺赞同的,我们计院的就业数据也就那样,年包二十到四十万的人也有,但少之又少,周围有认识的地信和电子的也有二到四十万的,找的还不错的包括我基本都是春招才找到的,个人是感觉春招机会挺多的,也可能是像楼主一样年初又找了个实习加技术又沉淀了一波的原因,本来秋招结束都想摆了,最后还是熬出来了大家别放弃啊,双非本也有翻身的机会的
点赞 评论 收藏
分享
抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务