文章目录
Set集合
1. 实现类特点
HashSet : 无序、不重复、无索引。
Set<String> sets = new HashSet<>();
LinkedHashSet:有序、不重复、无索引。
Set<String> sets = new LinkedHashSet<>();
2. 常用方法
- add // 增加
- remove // 删除
- size // 长度
- toArray // 将集合转化成数组
- equals contains // 判断相同
- isEmpty // 判断是否为空
- 增强for迭代
for(String str:hashSet){
if("jiaboyan".equals(str)){ // 判断
System.out.println("你就是我想要的元素:"+str);
}
System.out.println(str);
}
3. 例
字符串 0100110001010001 有多少个不同的非空子串? // 去重
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "0100110001010001";
// 去重使用set
Set<String> set = new HashSet<String>();
for(int i=0;i<s.length();i++) {
for(int st=0,en=i+1;en<=s.length();st++,en++) {
set.add(s.substring(st,en));
}
}
System.out.println(set.size());
}
List集合
1. 实现类特点
ArrayList : 有序集合(插入的顺序==输出的顺序)插入的元素可以为null。
List<String> list = new ArrayList<String>();
LinkedList
List<String> linkedList = new LinkedList<String>();
2. 常用方法
- add // 增加
- clear // 清空
- remove // 删除
- get // 获取
- size // 长度
- toArray // 将集合转化为数组
3. 例
有n箱货物 摆成长宽高 n=LWH
当n=4 可以有6种方案 1 * 1 * 4 / 1 * 4 * 1 … 不需要去重
求n=2021041820210418 总共有多少种方案
public static void main(String[] args) {
// TODO Auto-generated method stub
long n = 2021041820210418l;
long temp = n;
// 去重
Set<Long> set = new HashSet<Long>();
for(long i=1;i<temp;i++) {
if(n%i == 0) {
temp = n/i;
set.add(i);
set.add(temp);
}
}
int cnt = 0;
// 根据key获取值
ArrayList<Long> list = new ArrayList<Long>(set);
for(int i=0;i<list.size();i++) {
long a = list.get(i);
for(int j=0;j<list.size();j++) {
long b = list.get(j);
if(a*b>n) {
continue;
}
for(int k=0;k<list.size();k++) {
long c = list.get(k);
if(a*b*c == n) {
cnt++;
}
}
}
}
System.out.println(cnt);
}
数
1. 质数
private static boolean prime(int n) {
// TODO Auto-generated method stub
if(n<=3) { // 如果传值小于3 直接返回
return n>1;
}
for(int i=2;i<=Math.sqrt(n);i++) { // 从2开始判断 Math.sqrt()减少循环次数
if(n%i == 0) {
return false; // 有约数 非质数
}
}
return true;
}
2. 最大公约数
public int Gcd(int a ,int b ) {
if(b == 0)
return a;
else
return Gcd(b , a%b) // 递归
}
3. 斐波那契数列
public class Main {
int a[] = new int[2019];
a[0] = 0;
a[1] = a[2] = 1;
for(int i=3;i<2020;i++) {
a[i] = a[i-1]+a[i-2]; // 从第三个数开始 值等于前两个数相加
}
}
4. 回文数
public class Main {
for(int i = 1000;i < 10000;i++) {
int temp = i;
int reverse = 0;
while(temp != 0) {
int remain = temp % 10; // 获取最后一个属
temp /= 10;
reverse = reverse * 10 + remain; // !关键步骤!
}
if(reverse == i) {
System.out.println(reverse);
}
}
}
5. 大数版最大公约数
private static BigInteger gcd(BigInteger a, BigInteger b) {
// if(b.equals(BigInteger.ZERO))
// 利用equals做判断 相等返回true 不相等返回false
if(b.compareTo(BigInteger.ZERO)==0) { // 利用compareTo做判断
return a;
}
return gcd(b,a.mod(b));
}
6. 大数版斐波那契数列
public class Main {
BigInteger a[] = new BigInteger[2021];
a[0] = BigInteger.ZERO;
a[1] = a[2] = BigInteger.ONE;
// 要取到a[2020] 则小于2021
for(int i=3;i<2021;i++) {
a[i] = a[i-1].add(a[i-2]);
}
}
7. 大数版回文数
- 将 int型 转化成 字符串型
// 判断回文
public static boolean isPalindrome(int num) {
String snumString = "" + num;
StringBuilder stringBuilder = new StringBuilder(snumString);
return stringBuilder.reverse().toString().equals(snumString);
}