题目: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)
}