題目:3307. 找出第 K 個字符 II
思路:位運算,時間復雜度0(logk)。
當2^(i-1) <k 且 2^i>k ,說明k在K=2^i的右半段 ,k和其前半段的某個字符有關系
即當k>K時,k是由k-K位置上的字符變化而來,細節看注釋
C++版本:
class Solution {
public:typedef long long LL;char kthCharacter(long long k, vector<int>& operations) {// 找到第一個不比k小的K=2^ansLL K=1;int ans=0;while(K<k){K<<=1;ans++;}// 當為1時,說明是要+1,那用op來累計int op=0;for(int i=ans;i>=0;i--){//k>K時,說明k是由k-K位置上的字符變化而來if(k>K){// 維護kk-=K;// 操作為1,要op++if(operations[i]==1) op++;}K>>=1;}//由'a'經過op次+1得到return 'a'+op%26;}
};
JAVA版本:
class Solution {public char kthCharacter(long k, int[] operations) {long K=1;int ans=0;while(K<k){K<<=1;ans++;}int op=0;for(int i=ans;i>=0;i--){if(k>K){k-=K;if(operations[i]==1) op++;}K>>=1;}return (char)('a'+op%26);}
}
Go版本:
func kthCharacter(k int64, operations []int) byte {var K int64 =1ans:=0for K<k {K<<=1ans++}op:=0for i:=ans;i>=0;i-- {if(k>K){k-=Kif operations[i]==1 {op++;}}K>>=1;}return byte('a'+op%26)
}