例题1: 720. 词典中最长的单词
class Solution {
public String longestWord(String[] words) {
Arrays.sort(words, (a, b) -> {
if (a.length() != b.length()) {
return a.length() - b.length();
}
// 相同长度下把字典序较大的排在前面
return b.compareTo(a);
});
String ans = "";
Set<String> set = new HashSet<>();
set.add("");
for (String word : words) {
if (set.contains(word.substring(0, word.length() - 1))) {
ans = word;
// 注意是逐步多一,所以,这个添加要放在if里面
set.add(word);
}
}
return ans;
}
}
例题2: 四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 44 个正整数的平方和。
如果把 00 包括进去,就正好可以表示为 44 个数的平方和。
比如:
5=02+02+12+22 7=12+12+12+22
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 4 个数排序:
0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,d为联合主键升序排列,最后输出第一个表示法。
package four;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
class Node{
int c;
int d;
public Node(int c,int d){
this.c=c;
this.d=d;
}
}
//这道题的思路其实是很简单的就是找出四个数的平方之和等于n
//如果在没有数量限制的情况下直接使用四个for循环肯定是可以解题的
//但是有条件限制所以只能另辟蹊径:就是将ab分为一组,bc分为另一组
//利用Map将两者建立联系,右因为要输出第一个表示法,所以Map中值保存第一次出现的平方和
public class Four_8 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
// 创建一个Map将cd的平方和与cd建立联系
Map<Integer,Node> map=new HashMap<Integer,Node>();
for(int c=0;c*c<=n;c++) {
for(int d=c;d*d<=n;d++) {
if(!map.containsKey(c*c+d*d)) {
Node node=new Node(c,d);
map.put(c*c+d*d, node);
}
}
}
// 将ab从小到大遍历,并在map中寻找合适的cd值
for(int a=0;a*a<=n;a++) {
for(int b=a;b*b<=n;b++) {
int key=n-a*a-b*b;
if(map.containsKey(key)) {
int c=map.get(key).c;
int d=map.get(key).d;
System.out.print(a+" "+b+" "+c+" "+d);
return;
}
}
}
}
// 创建一个类将bc联系在一起,因为map只能和一个变量建立联系
}