1. 平方末尾
能够表示为某个整数的平方的数字称为“平方数” 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。 因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。 所以,4325435332必然不是平方数。 如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗? 请计算一下,一个2位以上的平方数的最后两位有多少种可能性?
思路分析:
- 先创建Set集合,用于存储和统计可能性
- Set集合可以去重
因为是否为平方数,只和末尾两位有关系,所以我们只需要验证 10~100的平方即可 ```java public class 平方末尾 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();//创建set集合
//在10 ~100的平方找出末两位
for(int i = 10;i<100;i++){
int length = String.valueOf(i * i).length();//获取平方数的长度
String str = String.valueOf(i*i).substring(length-2,length);//截取平方数的末尾两位 100 sub(3-2=1) (1,3)
set.add(str);//统计末尾两位数的情况.
}
System.out.println(set.size());
}
}
<a name="04RyQ"></a>
# 2. 全排列问题
> 有ABCDE五个字母,他们之间一共可以组成多少种顺序不同的组合(字母不能重复)
<a name="eMAcP"></a>
## 思路分析
```java
import java.util.Stack;
/**
* abc 多少种组合排序
*/
public class _C全排列 {
static int count = 0; //用于记录有多少种组合
public static void main(String[] args) {
//创建数组用于存放abcde
char c[] = new char[3];
//创建一个bool类型数据,用于标记 a b c d e是否
boolean b[] = new boolean[c.length];
f(0,c,b);
}
public static void f(int step,char c[],boolean b[]){
if(step == 3){ //等于5时说明完成一次组合
//打印数组
for(char c1:c){
System.out.print(c1+" ");
}
System.out.println();
count++;
}
//循环遍历组合
for(int i =0;i<c.length;i++){ //
if(!b[i]){ //如果某一位还没有被选中过
c[step] = (char) (i+'a');
b[i] = true; //被选中过,标记为true
f(step+1,c,b);
b[i] = false;//回溯
}
}
}
}
3. 背包问题(动态规划)
package com.atguo.demo;
/**
* 01背包问题的描述:
* 有编号分别为a,b,c,d,e的五件物品,
* 它们的重量分别是2,2,6,5,4,
* 它们的价值分别是6,3,5,4,6,
* 现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?
*/
public class DpATest {
static int f[][] = new int[5][9];
static int w[] = {0,2,3,4,5};
static int v[] = {0,3,4,5,8};
public static void main(String[] args) {
for(int i = 1;i<5;i++){ //i件物品
for(int j = 1;j<9;j++){ //j:背包的容量
if(w[i]>j){
f[i][j] = f[i-1][j];
}else{
f[i][j] = Math.max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
}
}
}
for(int i = 1;i<5;i++){
System.out.println();
for(int j = 1;j<9;j++){ //j:背包的容量
System.out.print(f[i][j]+" ");
}
}
System.out.println(f[4][8]);
}
}
4. 年龄问题(简单遍历)
/**
* s夫人一向很神秘。这会儿有人问起她的年龄,她想了想说:
* “20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍”。
* 你能算出s夫人现在的年龄吗?
*/
public class _01年龄问题 {
public static void main(String[] args) {
for(int i = 1;i<100;i++){
for(int j = 1;j<100;j++){
if((i-20) == (j-20)*2 && i == j*1.5 ){
System.out.println(i+" "+j);
}
}
}
}
5. 奇数倍数
/**
* 请你找到最小的整数 X 同时满足:
* • X 是 2019 的整倍数
* • X 的每一位数字都是奇数
* 【答案提交】
* 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
* 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
*/
public class _A奇数倍数 {
public static void main(String[] args) {
int x = 2019;
while (true){
if(f(x)){
System.out.println(x);
return;
}
x+=2019;
}
}
//比较个位数
public static boolean f(int n ){
int x = n;
while (x!=0){
if(f1(x%10)){//如果有一个偶数
return false;
}
x/= 10;
}
return true;
}
public static boolean f1(int n1){
return (n1&1)!=1;//偶数返回true
}
}
6. 七星末尾(回溯)
package com.atguo.demo2016;
import java.util.HashSet;
import java.util.Set;
/**
* 能够表示为某个整数的平方的数字称为“平方数”
* 比如,25,64
* 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数。
* 因为平方数的末位只可能是:[0, 1, 4, 5, 6, 9] 这6个数字中的某个。
* 所以,4325435332必然不是平方数。
*
* 如果给你一个2位或2位以上的数字,你能根据末位的两位来断定它不是平方数吗?
*
* 请计算一下,一个2位以上的平方数的最后两位有多少种可能性?
*/
public class 平方末尾 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();//创建set集合
//在10 ~100的平方找出末两位
for(int i = 10;i<10000;i++){
int length = String.valueOf(i * i).length();//获取平方数的长度
String str = String.valueOf(i*i).substring(length-2,length);//截取平方数的末尾两位 100 sub(3-2=1) (1,3)
set.add(str);//统计末尾两位数的情况.
}
System.out.println(set.size());
}
}