每日一题
力扣 每日一题
738
/*
如1231322
该数最小不会小于999999
最大不会超过1231322
(但时间复杂度过高)
先处理判断该数是否为单调递增的函数
本题方法应该是
1
12
123
1231(x)
1229
12299
122999
1229999
1221322
1
12
122
1221(x)
121(x)
119
1199
11999
119999
1199999
步骤一:
拆分出从头开始最长的单调递增数
直到不是单增数为止
步骤二
当前最右边的数-1
判断此时是否为单调递增数
若是,则步骤三
否,则抛弃最右边的数
对新数字字符串执行步骤二
步骤三:
添加字符’9’到该数字字符串长度与原数字字符串相同为止
此时
*/
class Solution {
static boolean judge(String N){
for(int i = 0; i < N.length() - 1; i++)
if(Integer.parseInt("" + N.charAt(i)) > Integer.parseInt("" + N.charAt(i + 1)))
return false;
return true;
}
public static int monotoneIncreasingDigits(int N) {
String number = "" + N, temp = "";
for(int i = 0; i < number.length(); i++){
temp += number.charAt(i);
if(!judge(temp)){
temp = temp.substring(0, temp.length() - 1);
break;
}
}
if(temp.equals(number))return Integer.parseInt(temp);
while(true){
temp = temp.substring(0, temp.length() - 1) + (Integer.parseInt("" + temp.charAt(temp.length() - 1)) - 1);
if(judge(temp))break;
temp = temp.substring(0, temp.length() - 1);
}
while(temp.length() != number.length())temp += "9";
return Integer.parseInt(temp);
}
public static void main(String[] args) {
int N = 1234;
System.out.println(monotoneIncreasingDigits(N));
}
}
290.单词规律
本题本应用哈希映射解决,但由于对哈希表不是特别熟悉故没有使用,而是采用了自己建立的映射。
import java.util.Vector;
class Solution {
public static boolean wordPattern(String pattern, String s) {
String pa[] = s.split(" ");
boolean [] len = new boolean[pa.length];
Vector<String> judge = new Vector<String>();
if(pattern.length() != pa.length)return false;
//识别pattern中哪些位置相同,并比较s中该位置是否相同
for(int i = 0; i < pattern.length(); i++){
if(len[i])continue;
char temp = pattern.charAt(i);
if(judge.indexOf(pa[i]) != -1)return false;
judge.add(pa[i]);
Vector<Integer> local = new Vector<Integer>();
for(int j = i; j < pattern.length(); j++){
if(len[j])continue;
if(temp == pattern.charAt(j)){
len[j] = true;
local.add(j);
}
}
for(int j : local){
if(!pa[j].equals(pa[local.get(0)]))return false;
}
local = null;
}
return true;
}
}