转换字符串的最少操作次数(回顾等级:不值得;已达最优解)
来源:自己LeetCode刷题
usa
int minimumMoves(char * s)
{
int sz=strlen(s);
int res=0;
for (int i=0;i<sz;i++)
{
if (s[i]=='X')
{
i+=2;
res++;
}
}
return res;
}
是否所有1都至少相隔k个元素(回顾等级:不值得;已达最优解)
来源:自己LeetCode刷题
usa
bool kLengthApart(int* nums, int numsSize, int k)
{
int flag=0;
int begin=0;
for (int i=0;i<numsSize;i++)
{
if (nums[i]==1)
{
if (flag==0)
{
begin=i;
flag=1;
}
else
{
if (i-begin-1<k)
{
return false;
}
else
{
begin=i;
}
}
}
}
return true;
}
重复至少k次且长度为M的模式(回顾等级:可以;已达最优解)
来源:自己LeetCode刷题
usa
bool containsPattern(int* arr, int arrSize, int m, int k)
{
int num=k*m;
if (num>arrSize)
{
return false;
}
for (int i=0;i<=arrSize-num;i++)
{
for (int j=i;j<i+m;j++)
{
for (int q=1;q<=k-1;q++)
{
if (arr[j]!=arr[j+q*m])
{
goto A;
}
}
}
return true;
A:
continue;
}
return false;
}
移除指定数字得到的最大结果(回顾等级:可以;未达最优解:贪心)
来源:自己LeetCode刷题
usa
int compare(char* arr, int a, int b)
{
int begin1=0;
int begin2=0;
while(arr[begin1]!='\0' && arr[begin2]!='\0')
{
if (a==begin1)
{
begin1++;
}
if (b==begin2)
{
begin2++;
}
if (arr[begin1]>arr[begin2])
{
return a;
}
else if (arr[begin1]<arr[begin2])
{
return b;
}
else
{
begin1++;
begin2++;
}
}
return a;
}
char * removeDigit(char * number, char digit)
{
int sz=strlen(number);
int ans=0;
int count=0;
for (int i=0;i<sz;i++)
{
if (number[i]==digit)
{
count++;
if (count==1)
{
ans=i;
}
else
{
ans=compare(number, ans,i);
}
}
}
char* res=(char*)malloc(sizeof(char)*sz);
int k=0;
for (int i=0;i<sz;i++)
{
if (i!=ans)
{
res[k++]=number[i];
}
}
res[k++]='\0';
return res;
}
得到k个黑块的最少涂色次数(回顾等级:可以;已达最优解)
来源:自己LeetCode刷题
usa
int minimumRecolors(char * blocks, int k)
{
int sz=strlen(blocks);
int sum=0;
for (int i=0;i<k;i++)
{
if (blocks[i]=='W')
{
sum++;
}
}
int ans=sum;
for (int i=1;i<=sz-k;i++)
{
int left=i;
int right=i+k-1;
if (blocks[left-1]=='W')
{
sum--;
}
if(blocks[right]=='W')
{
sum++;
}
ans=ans<sum?ans:sum;
}
return ans;
}
- 滑动窗口,时间复杂度为O(N)