69. x 的平方根
1.题目:
给你一个非负整数 x
,计算并返回 x
的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)
或者 x ** 0.5
。
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
2.思路:
考察:二分查找
3.代码:
public int mySqrt(int x) {
//二分查找
int left=0,right=x,res=-1;
while(right>=left){
int mid=(right+left)/2;
if((long)mid*mid<=x){
res=mid;
left=mid+1;
}else{
right=mid-1;
}
}
return res;
}
205. 同构字符串
1.题目:
给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s ="egg",
t ="add"
输出:true
示例 2:
输入:s ="foo",
t ="bar"
输出:false
2.思路:
考察:哈希表
使用两个map 保存 s[i] 到 t[j] 和 t[j] 到 s[i] 的映射关系,如果发现对应不上,立刻返回 false
3.代码:
public boolean isIsomorphic(String s, String t) {
//map映射
//map1:s[i]到t[j]的映射
Map<Character,Character> map1=new HashMap<>();
//map2:t[j]到s[i]的映射
Map<Character,Character> map2=new HashMap<>();
for(int i=0,j=0;i<s.length();i++,j++){
if(!map1.containsKey(s.charAt(i))){
map1.put(s.charAt(i),t.charAt(j));
}
if(!map2.containsKey(t.charAt(j))){
map2.put(t.charAt(j),s.charAt(i));
}
if(map1.get(s.charAt(i))!=t.charAt(j) || map2.get(t.charAt(j))!=s.charAt(i)){
return false;
}
}
return true;
}
1002. 查找共用字符
1.题目:
给你一个字符串数组 words
,请你找出所有在 words
的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。
示例 1:
输入:words = ["bella","label","roller"] 输出:["e","l","l"]
示例 2:
输入:words = ["cool","lock","cook"] 输出:["c","o"]
2.思路:
哈希:字母+求频率
将字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。
统计出搜索字符串里26个字符的出现的频率,然后取每个字符频率最小值,最后转成输出格式
注意:
基本数据类型之间的运算规则:
byte、char、short -> int -> long -> float -> double
注意:byte、char、short这三种数据类型做运算时,结果为int型。
public static void main(String[] args) {
char one = 'a'; //97
char two = 'b'; //98
int three = 10;
String str = "hello";
System.out.println(one + three); //107
System.out.println(one + str); //ahello
System.out.println(three + str); //10hello
System.out.println(one + 2); //99
System.out.println(one + two); //195
}
从小到大:自动类型提升
从大到小:强制类型转换
3.代码:
public List<String> commonChars(String[] words) {
List<String> result=new ArrayList<>();
int[] hash=new int[26];
//字符串数组的每个元素是由字符串组成,length()方法。数组length属性。
for(int i=0;i<words[0].length();i++){
hash[words[0].charAt(i)-'a']++;
}
for(int i=1;i<words.length;i++){
int[] hashOther=new int[26];
for(int j=0;j<words[i].length();j++){
hashOther[words[i].charAt(j)-'a']++;
}
for(int k=0;k<hash.length;k++){
hash[k]=Math.min(hash[k],hashOther[k]);
}
}
for(int i=0;i<26;i++){
while(hash[i]!=0){
result.add(String.valueOf((char)(i+'a')));
hash[i]--;//每个字符可能重复出现,
}
}
return result;
}