本周每日一题 题目
- lc 299. 猜数字游戏
- lc 520. 检测大写字母
这一周写的很少,因为在忙毕设,认认真真的写了好几天的代码,所以错过了每日一题就错过了把,不是啥问题,有空就做
11-08 lc299. 猜数字游戏
- 两遍循环解决,第一遍是将相同的bull记录下来,同时记下secret有多少个不一样的数字情况,第二遍是将不同的cow计算出来
- 这里因为出现的样本有限,所以用数组代替map,速度加快
- 同时,StringBuilder#append的速度大幅领先与String的+
- 经过优化,最终达到100%时间,70%的空间
class Solution {
//就是把对应位置的直接bull,非对应位置的记在map中,就是cow
//同时遍历两个似乎不大行,先遍历secret,然后再遍历guess,用map进行对比
//有一个问题,就是相等位置的可能会导致
public String getHint(String secret, String guess) {
StringBuilder sb = new StringBuilder();
char[] ss = secret.toCharArray(), gg = guess.toCharArray();
int[] cnt = new int[10];
int bull = 0, cow = 0;
for(int i=0; i<gg.length; i++){
if(ss[i]==gg[i]) bull++;
else cnt[ss[i]-'0']++;
}
for(int i=0; i<gg.length; i++){
if(ss[i]!=gg[i]&&cnt[gg[i]-'0']>0){
cow++;
cnt[gg[i]-'0']--;
}
}
return sb.append(bull).append("A").append(cow).append("B").toString();//sb的时间还是比string快太多了
}
}
11-13 lc520. 检测大写字母
- 这是题目的要求
- 针对这个要求,我们可以如下的分析题目的解法 ```txt
第一个字母大写,后面的需要全部保持一致,要么全大,要么全小
第一个字母小写,后面必须全部小写
- 如此,那么就很简单了,代码如下
class Solution {
public boolean detectCapitalUse(String word) {
char[] ss = word.toCharArray();
int n = ss.length;
boolean first = ss[0] > 96; //第一个字母情况
for(int i=1; i<n; i++){
if(first){
if(ss[i]<96) return false;
}
if(i>1){
int x = ss[i]>95? 1: 0;
int y = ss[i-1]>95? 1: 0;
if((x^y)==1) return false;//异或来进行判断是否一致
}
}
return true;
}
}