Leetcode
day02
T1750. 删除字符串两端相同字符后的最短长度
给你一个只包含字符 ‘a’,‘b’ 和 ‘c’ 的字符串 s ,你可以执行下面这个操作(5 个步骤)任意次:选择字符串 s 一个 非空 的前缀,这个前缀的所有字符都相同。选择字符串 s 一个 非空 的后缀,这个后缀的所有字符都相同。前缀和后缀在字符串中任意位置都不能有交集。前缀和后缀包含的所有字符都要相同。同时删除前缀和后缀。请你返回对字符串 s 执行上面操作任意次以后(可能 0 次),能得到的 最短长度 。
int minimumLength(char * s){
int pre = 0, rear = strlen(s)-1;
if(pre == rear) {
return 1;
}
while(pre<rear && s[pre]==s[rear]) {
//左边相同
while(pre<rear && s[pre]==s[pre+1]) {
pre++;
}
//右边相同
while(pre<rear && s[rear]==s[rear-1]) {
rear--;
}
pre++;
rear--;
}
if(pre>rear){
return 0;
}else {
return (rear-pre+1);
}
}
学习感悟
-
字符串常量的本质是一个地址,char*s存入的是字符串的首地址
-
前后缀通过双指针pre 、rear实现对比分别向前向后递进
-
length = 1 输出1 length > 1 && 所有前后缀对应相同 输出0 length > 1 && 存在前后缀对应相同 输出中间部分 length > 1 && 没有前后缀对应相同 输出全部
T231.2的幂
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
-
递归法
return function(n/2)
bool isPowerOfTwo(int n){ if(n==1) return true;//2的x次幂递归到最后都为2,整除为1 if(n<1) return false; if(n%2==1) return false;//保证因数含有奇数不会进入递归 return isPowerOfTwo(n/2); }
-
位运算
-
n&(n-1)==0,二进制运算,2的幂的二进制都为1000000000
-
n>0
bool isPowerOfTwo(int n){ return (n > 0) && (n & (n-1))==0; }
-
学习感悟:
-
每个函数对应一个return值,一旦有一个return返回值,即退出递归
-
若 n = 2^x,恒有 n & (n - 1) == 0
- n二进制最高位为 1,其余所有位为 0;
- n - 1二进制最高位为 0,其余所有位为 1;