【京東】(數據分析工程師-筆試)最優打字策略【Python】

【京東】(數據分析工程師-筆試)最優打字策略【Python】

題目描述

在英文的輸入中,我們經常會遇到大小寫切換的問題,頻繁切換大小寫會增加我們按鍵的次數,也會降低我們的打字策略。

衆所周知,切換大小寫有兩種方式,一種是按下“Caps locks”,也就是大寫鎖定鍵,這樣一來,之後的輸入模式都會被切換。另一種是同時按下shift和需要打印的字母,可以臨時切換大小寫(算作按下兩個鍵)。

已知初始狀態下,打字模式是小寫,現在給出需要打印的字符串(區分大小寫),請你計算出最少需要按鍵多少次才能打印出來。

輸入

輸入第一行僅包含一個正整數n,表示字符串的長度(1<=n<=1000000)。
輸入第二行包含一個長度爲n的字符串,僅包含大小寫字母。

輸出

輸出僅包含一個正整數,即最少的按鍵次數。

樣例輸入

6
AaAAAA

樣例輸出

8

只考慮大小寫變換就轉換(18%)

n = int(input())
s = input()
mark = 0
count = 0
for i in range(n):
    if mark == 0 :
        if 'a'<=s[i]<='z':
            count += 1
        else:
            count += 2
            mark = 1
    else:
        if 'a'<=s[i]<='z':
            count += 2
            mark = 0
        else:
            count += 1
print (count)

考試時只是簡單寫了只考慮轉換的情況,結束後牛客刷到了貪心算法

貪心算法(100%)

n = int(input())
s = input()
dp = [[0,0] for i in range(n)]
if 'A' <= s[0] <= 'Z':
    dp[0][0] = 2
    dp[0][1] = 2
else:
    dp[0][0] = 1
    dp[0][1] = 2
# print ('第一個字符:',s[0],'當前狀態:',dp[0])
for i in range(1,n):
    if 'A' <= s[i] <= 'Z':
        dp[i][0] = min(dp[i-1][0]+2,dp[i-1][1]+2)
        dp[i][1] = min(dp[i-1][0]+2,dp[i-1][1]+1)

    else:
        dp[i][0] = min(dp[i-1][0]+1,dp[i-1][1]+2)
        dp[i][1] = min(dp[i-1][0]+2,dp[i-1][1]+2)
    # print('第{}個字符:'.format(i), s[i], '當前狀態:', dp[i])
print(min(dp[-1][0],dp[-1][1]))

發佈了54 篇原創文章 · 獲贊 5 · 訪問量 4845
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章