题目:

解析:从前往后遍历字符串,判断i位置前一个和后一个有没有和 “a” 到 “z” 相等,不相等就把问好替换; 注意特殊情况 “?” 在最前面和最后面。
代码:
public String modifyString(String ss) {
char[] s = ss.toCharArray();
int n = s.length;
for(int i = 0; i < n; i++){
if(s[i] == '?'){
for(char ch = 'a'; ch <= 'z'; ch++){
if((i == 0 || ch != s[i-1]) && (i == n-1 || ch != s[i+1])){
s[i] = ch;
break;
}
}
}
}
return String.valueOf(s);
}题目:

解析:

代码:
public int findPoisonedDuration(int[] timeSeries, int duration) {
int ret = 0;
for(int i = 1; i < timeSeries.length; i++){
int x = timeSeries[i] - timeSeries[i-1];
if(x < duration) ret += x;
else ret += duration;
}
return ret+duration;
}题目:

解析:
方法一:用一个方向变量定义方向,方向变量向下行数+1; 方向变量向上行数-1
代码:
public static String convert(String ss, int numRows) {
if(numRows == 1){
return ss;
}
char[] s = ss.toCharArray();
String[] array = new String[numRows];
Arrays.fill(array, "");//上面默认会赋值null,这里要赋值一下
//方向变量向下行数+1; 方向变量向上行数-1
boolean down = false;
for(int i = 0,row = 0; i < s.length; i++){
array[row] += s[i];
//如果方向到第一行或者最后一行,要改变
if(row == 0 || row == numRows-1){
down = !down;
}
row += down ? 1 : -1;
}
StringBuilder stringBuilder = new StringBuilder();
for(String x : array){
stringBuilder.append(x);
}
return stringBuilder.toString();
}方法二:
解析: 模拟类型的题优化就是找规律

代码:
//方法二:
public static String convert(String ss, int numRows) {
if(numRows == 1) return ss;
char[] s = ss.toCharArray();
int d = 2 * numRows - 2;
int n = s.length;
StringBuilder ret = new StringBuilder();
//1.处理第一行
for(int i = 0; i < n; i+=d)
ret.append(s[i]);
//2.枚举处理中间行
for(int k = 1; k < numRows-1; k++)
for(int i = k, j = d-i; i < n || j < n; i += d,j += d){
if(i < n) ret.append(s[i]);
if(j < n) ret.append(s[j]);
}
//1.处理最后一行
for(int i = numRows-1; i < n; i+=d)
ret.append(s[i]);
return ret.toString();
}题目:

解析:

代码:
public String countAndSay(int n) {
String ret = "1";
//描述,n-1次即可
for(int i = 1; i < n; i++){
StringBuilder tmp = new StringBuilder();
//具体的描述
int len = ret.length();
for(int left = 0, right = 0; right < len; ){
while(right < len && ret.charAt(right) == ret.charAt(left)) right++;
tmp.append(Integer.toString(right-left));
tmp.append(ret.charAt(left));
left = right;
}
ret = tmp.toString();
}
return ret;
}题目:

解析:

代码:
public int minNumberOfFrogs(String c) {
char[] croakOfFrogs = c.toCharArray();
String t = "croak";
int n = t.length();
int[] hash = new int[n]; // 数组模拟哈希表
//再new一个哈希表来绑定,某个元素和下标关系
Map<Character,Integer> index = new HashMap<>();
for(int i = 0; i < n; i++)
index.put(t.charAt(i),i);
for(char ch : croakOfFrogs){
if(ch == t.charAt(0)){
if(hash[n-1] != 0) hash[n-1]--;
hash[0]++;
}else{
int i = index.get(ch);
if(hash[i-1] == 0) return -1;
hash[i-1]--; hash[i]++;
}
}
for(int i = 0; i <= n-2; i++)
if(hash[i] != 0)
return -1;
return hash[n-1];
}