蓝桥刷题note10(最长回文串,种花问题,柠檬水找零)
1.最长回文串
给定一个包含大写字母和小写字母的字符串 s
,返回 通过这些字母构造成的 最长的 回文串 的长度。
在构造过程中,请注意 区分大小写 。比如 "Aa"
不能当做一个回文字符串。
中心思路:找偶数个字符。
int longestPalindrome(char* s) {
int len=strlen(s);
if(len<2){
return len;
}
int n[128]={0};
for(int i=0;i<len;i++){
n[s[i]]++; //统计每个字符的个数
}
int length=0;
int mid=0;
for(int i=0;i<128;i++){
if(n[i]%2==0){ //找偶数个字符
length+=n[i];
}else{
length+=n[i]-1; //若为奇数个,则先加偶数个
mid=1;
}
}
if(mid){
length+=1; //有中间数长度加一,不上之前少加的
}
return length;
}
2.种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed
表示花坛,由若干 0
和 1
组成,其中 0
表示没种植花,1
表示种植了花。另有一个数 n
,能否在不打破种植规则的情况下种入 n
朵花?能则返回 true
,不能则返回 false
。
中心思路:遍历数组,若为0,检查前后是否为零,还有数组头和尾的特殊位置也要考虑。
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
if(n==0){
return true;
}
for(int i=0;i<flowerbedSize;i++){
if(flowerbed[i]==0){
if((i==0||flowerbed[i-1]==0)&&(i==flowerbedSize-1||flowerbed[i+1]==0)){
flowerbed[i]=1;
n--;
}
}
}
return n<=0;
}
3.柠檬水找零
在柠檬水摊上,每一杯柠檬水的售价为 5
美元。顾客排队购买你的产品,(按账单 bills
支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5
美元、10
美元或 20
美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5
美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills
,其中 bills[i]
是第 i
位顾客付的账。如果你能给每位顾客正确找零,返回 true
,否则返回 false
。
中心思路:设三个变量用来储存收到不同面额钞票的数量,并实时检查找钱情况,更新数量
bool lemonadeChange(int* bills, int billsSize) {
if(bills[0]==10||bills[0]==20){
return false;
}
int num1=0,num2=0,num3=0;
for(int i=0;i<billsSize;i++){
if(bills[i]==5){
num1++;
}
if(bills[i]==10){
num2++;
if(num1>0){
num1--;
}else{
return false;
}
}
if(bills[i]==20){
num3++;
if(num1>0&&num2>0){ //优先找带10元的
num1--;
num2--;
}
else if(num1>=3){
num1-=3;
}
else{
return false;
}
}
}
return true;
}