C++ LeetCode1945題解字符串轉(zhuǎn)化后的各位數(shù)字之和
1945.字符串轉(zhuǎn)化后的各位數(shù)字之和
力扣題目鏈接:leetcode.cn/problems/su…
給你一個由小寫字母組成的字符串 s
,以及一個整數(shù) k
。
首先,用字母在字母表中的位置替換該字母,將 s
轉(zhuǎn)化 為一個整數(shù)(也就是,'a'
用 1
替換,'b'
用 2
替換,... 'z'
用 26
替換)。接著,將整數(shù) 轉(zhuǎn)換 為其 各位數(shù)字之和 。共重復(fù) 轉(zhuǎn)換 操作 k
次 。
例如,如果 s = "zbax"
且 k = 2
,那么執(zhí)行下述步驟后得到的結(jié)果是整數(shù) 8
:
- 轉(zhuǎn)化:
"zbax" ? "(26)(2)(1)(24)" ? "262124" ? 262124
- 轉(zhuǎn)換 #1:
262124 ? 2 + 6 + 2 + 1 + 2 + 4 ? 17
- 轉(zhuǎn)換 #2:
17 ? 1 + 7 ? 8
返回執(zhí)行上述操作后得到的結(jié)果整數(shù)。
示例 1:
<strong>輸入:</strong>s = "iiii", k = 1 <strong>輸出:</strong>36 <strong>解釋:</strong>操作如下: - 轉(zhuǎn)化:"iiii" ? "(9)(9)(9)(9)" ? "9999" ? 9999 - 轉(zhuǎn)換 #1:9999 ? 9 + 9 + 9 + 9 ? 36 因此,結(jié)果整數(shù)為 36 。
示例 2:
<strong>輸入:</strong>s = "leetcode", k = 2 <strong>輸出:</strong>6 <strong>解釋:</strong>操作如下: - 轉(zhuǎn)化:"leetcode" ? "(12)(5)(5)(20)(3)(15)(4)(5)" ? "12552031545" ? 12552031545 - 轉(zhuǎn)換 #1:12552031545 ? 1 + 2 + 5 + 5 + 2 + 0 + 3 + 1 + 5 + 4 + 5 ? 33 - 轉(zhuǎn)換 #2:33 ? 3 + 3 ? 6 因此,結(jié)果整數(shù)為 6 。
提示:
1 <= s.length <= 100
1 <= k <= 10
s
由小寫英文字母組成
方法一:計算
字符串長度可能為100100100,C++C++C++等語言中很難直接存放下1020010^{200}10200的數(shù)
這里有兩種方案,一種是將數(shù)字以字符串的形式存放,另一種是,不存放1020010^{200}10200這么大的數(shù)字,而是直接存放這個數(shù)字的每位之和
這個數(shù)字的每位之和最大不超過9×2009\times2009×200,很容易用整數(shù)型變量存下。
接下來就是進(jìn)行k−1k-1k−1次特殊計算
計算的時候,我們將這個數(shù)的每一位不斷取出,并累加到一個臨時變量中,然后使用這個臨時變量代替這個數(shù)即可
// 一次求和操作 int temp = 0; while (ans) { temp += ans % 10; ans /= 10; } ans = temp;
- 時間復(fù)雜度O(\len(s)+k)O(\len(s) + k)O(\len(s)+k),每次求和操作的時間復(fù)雜度可以視為O(1)O(1)O(1),因為這個數(shù)最多不超過180018001800,最多進(jìn)行444次加法運算
- 空間復(fù)雜度O(1)O(1)O(1)
AC代碼
C++
class Solution { public: int getLucky(string& s, int k) { int ans = 0; for (char c : s) { ans += (c - 'a' + 1) / 10 + (c - 'a' + 1) % 10; } while (--k) { int temp = 0; while (ans) { temp += ans % 10; ans /= 10; } ans = temp; } return ans; } };
執(zhí)行結(jié)果:
以上就是C++ LeetCode1945題解字符串轉(zhuǎn)化后的各位數(shù)字之和的詳細(xì)內(nèi)容,更多關(guān)于C++字符串轉(zhuǎn)化數(shù)字和的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實現(xiàn)LeetCode(149.共線點個數(shù))
這篇文章主要介紹了C++實現(xiàn)LeetCode(149.共線點個數(shù)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解
函數(shù)就是一段封裝好的,可以重復(fù)使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。這篇文章主要介紹了c語言是如何處理函數(shù)調(diào)用的?需要的朋友可以參考下2023-02-02C++多字節(jié)字符與寬字節(jié)字符相互轉(zhuǎn)換
最近在C++編程中經(jīng)常遇到需要多字節(jié)字符與寬字節(jié)字符相互轉(zhuǎn)換的問題,自己寫了一個類來封裝wchar_t與char類型間的轉(zhuǎn)換2012-11-11