目录
1.ASCII码与字符转换
2.四舍五入保留整数
3.如何设置保留固定小数位数
4.闰年判断条件
5.如何将一个字符串转换为一个数字?
6.字符串的分割函数
7.日期类
8.判断五个数不同 五个数范围都是1到9
9.振兴中华(基础动规问题)
10.获得数x各个位相加的返回值
10.题目细节
11. 纸牌三角形 牌型种类 煤球数量
12.求最小公倍数
13.归并排序
14.质数 (素数)
15.分数
16.跑步锻炼(模拟日期 重要***)
17.大数类的操作
18.数列求和
19.k倍区间 子串分值
20.进制转换
21.位运算
22.//1MB=1024KB=1024B,32位二进制整数是4字节,即4B
23.对数组进行排序
24.二分法专题
25.时间显示
26.printf的输出格式
27.快速幂
28.关于大数类
1.ASCII码与字符转换
采用强转的形式
public static void main(String[] args) {
System.out.println((int)'A');//65
System.out.println((int)'a');//97
System.out.println((char)65);//A
System.out.println((char)97);//a
System.out.println('a'-'a');//0
System.out.println('b'-'a');//1
}
2.四舍五入保留整数
计算a/b 使其四舍五入保留0位小数,且转换成百分比的形式 例如:99%
1.要将被除数,除数的数据类型改写为double
2.被除数要先乘以100
3.四舍五入要采用Math.round()方法 / 就可以得到0位小数
double num=sc.nextInt();
double pass=0;
double best=0;
System.out.println(Math.round(pass*100/num)+"%");
System.out.println(Math.round(best*100/num)+"%");
3.如何设置保留固定小数位数
法一:(47条消息) java保留double类型固定小数位数的方法_欢迎访问胡宝全的博客-CSDN博客
用String类的format方法 且此方法是四舍五入的
double x = 1.23456789
System.out.println(String.format("%.6f", x)); //表示四舍五入保留六位小数。
System.out.println(String.format("%.3f", x)); //表示四舍五入保留3位小数 输出为1.235
法二:
Math中的round方法 且此方法是四舍五入的
System.out.println((double)Math.round(x*1000)/1000.0); //表示四舍五入保留x小数点后三位小数结果为1.235
4.闰年判断条件
1,能被4整除,并且(&&)不能被100整除 或者 (||) 2,能被400整除
if (year % 4 == 0 && year % 100 != 0 ||year % 400 == 0) {
System.out.println(year + "是闰年!");
}
5.如何将一个字符串转换为一个数字?
前提是这个字符串是数字的类型,如“123”;(47条消息) Java中,如何将字符串转为数字(StringToNumber)_isea_you's blog-CSDN博客_java如何将字符串转换为数字
package com.isea.java;
public class Test {
public static void main(String[] args) {
String str = "123";
Integer num1 = new Integer(str);
int num2 = Integer.parseInt(str);
Integer num3 = Integer.valueOf(str);
System.out.println(num1 + "\t" + num2 + "\t" + num3);//123 123 123
}
}
如果要使用浮点数,可以使用Float.ParseFloat或者是Double.ParseDouble
6.字符串的分割函数
(47条消息) 字符串分割-Java中的String.split()方法_Yui的博客-CSDN博客_java string.split()用字符串分割
在java.lang.String包中有split()方法,该方法的返回值是一个String类型的数组。返回的数组不含有分隔符
split()方法分别有以下两种重载方式:
split(String regex);
split(String regex,int limit);
参数regex :即 regular expression (正则表达式)。这个参数并不是一个简单的分割用的字符,而是一个正则表达式,它对一些特殊的字符可能会出现你预想不到的结果。如果该参数为"",返回值为包含整个字符串的单一元素数组。
参数limit:该值用来限制返回数组中的元素个数(也就是最多分割成几个数组元素,只有为正数时有影响)
1、“.”和“|”作为分隔符时,前面必须得加”\\”;
用“*”或“+”或者“\\”作为分隔符参数,split()方法运行将抛出java.util.regex.PatternSyntaxException异常,也需要在前面加上“\\”进行转义。
String[] strArray = "192.168.0.1".split("\\.");
//"."作为分隔符时,必须用"\\"进行转义
for (String str:strArray) {
System.out.println(str);
}
2、如果在一个字符串中有多个分隔符,可以用“|”作为连字符;
*********改进行转义的越需要进行转义!!!!*******
public static void main(String[] args) {
/*
* String str=”Java string
split
test
*/
String[] strArray = "String str=”Java string-split#test".split("-|#");
//"."作为分隔符时,必须用"\\"进行转义
for (String str:strArray) {
System.out.println(str);
}
7.日期类
有趣的是MONTH字段是从0月开始计数的,所以12月对应的值是11。
DAY_OF_WEEK中星期天对应的是1,星期一对应的是2,星期六对应的是7
而YEAR和DAY_OF_MONTH都是从1开始计数
12月对应11 星期天对应1
详细参考:1.(48条消息) 算法竞赛中的常用JAVA API :Calendar日期类_GD_ONE的博客-CSDN博客
2.尚硅谷ppt
8.判断五个数不同 五个数范围都是1到9
(48条消息) 【蓝桥真题1】这道用了7个for循环的蓝桥真题,让舍友哭着跑出考场【内附原题资源】_执梗的博客-CSDN博客
public class 马虎的算式 {
public static void main(String[] args) {
int count=0;
for (int a = 1; a <= 9; a++) {
for (int b = 1; b <= 9; b++) { //每次for循环前要判断前面是否有相等元素
if (a != b) for (int c = 1; c <= 9; c++) {
if (b != c && a != c) for (int d = 1; d <= 9; d++) {
if (a != d && b != d && c != d) for (int e = 1; e <= 9; e++) {
if (a != e && b != e && c != e && d != e) {
if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (c * 10 + e)) {
count++;
}
}
}
}
}
}
}
System.out.println(count);//答案为142
}
}
9.振兴中华(基础动规问题)
10.获得数x各个位相加的返回值
采用先取余10获得最低位数 再将该数除10 依次进行
public static int sum(int x){//获得数x各个位相加的返回值
int count=0;
while(x>0){
count+=x%10;
x=x/10;
}
return count;
}
10.题目细节
首先这个题目有个大坑。看它给的第一个例子,如果按代码中的除来算,8/3应该等于2,952/714等于1,这样最后的答案6+2+1=9,并不等于10。我们代码中在整数类型里的除号并不是严格意义的除号,而是取模,小数部分直接被舍去了的。题目里的要求其实需要我们进行通分,也就是B/C+DEF/GHI进行通分以后整除得到一个数加上A等于10。十个字母对应十种情况,那就是全排列考虑所有可能出现的情况,然后一个个判断是否符合。
所以全排列的时候代码要这么写 先保证 通分后相除是个整数 又要(&&) 保证相加等于10
(B*GHI+C*DEF)%(C*GHI)==0 && A+(B*GHI+C*DEF)%(C*GHI)==10
11. 纸牌三角形 牌型种类 煤球数量
(49条消息) 【蓝桥真题2】蓝桥杯不会全排列,那就只能写10个for循环了【内附近8年真题资源】_执梗的博客-CSDN博客
12.求最小公倍数
13.归并排序
归并排序的所有for区间都是 for (int i = left; i <= right; i++)
14.质数 (素数)
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
static int isPrime(int num) {
for (int i = 2; i <= Math.sqrt(num); i++) {
if(num%i==0)
return 0;
}
return 1;
}
15.分数
1/1+1/2+1/4+1/8+⋯
每项是前一项的一半,如果一共有 20 项,求这个和是多少,结果用分数表示出来。
类似:3/2,当然,这只是加了前 2 项而已。分子分母要求互质。
如何满足分子、分母互质呢?我们首先要求除分子、分母的最大公约数,然后分子、分母都除以这个最小公约数即可!
public class Main {
static int gcd(int a,int b) {
int temp;
while(b>0) {
temp=b;
b=a%b;
a=temp;
}
return a;
}
public static void main(String[] args) {
int z=1;//分子
int m=1;//分母
for (int i = 2; i <= 20; i++) {
m*=2;
z+=m;
}
int t=gcd(z, m);
z/=t;m/=t;
System.out.println(z+"/"+m);
}
}
16.跑步锻炼(模拟日期 重要***)
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(11日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
进行模拟 也可以采用日期类 但是我自己写的比较麻烦
下面这个模拟特别重要 一定一定要学会!!!!
tips:1.刚上来就day++ 所以起始日期是没有进行判断的!!!单独拿出来判断即可!!
2.while的结束条件: while(y!=2000 || m!=12 || d!=31) 中间用||
结束日期已经在循环体当中进行了判断!!!无需额外判断!!
public class 跑步锻炼 {
static int[] M={0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
int y = 2000, m = 1, d = 1, w = 6, ans = 0;
while(y!=2020 || m!=10 || d!=1){
if(y%400==0 || (y%4==0&&y%100!=0)){
M[2] = 29;
}
else{
M[2] = 28; //M是全局变量
}
d++;
w = (w + 1) % 7;//w为0为星期天
if(d > M[m]){
d = 1;
m ++;
}
if(m>12){
m = 1;
y ++;
}
if(d==1 || w==1){
ans++; //是月初或者周一多加一次
}
ans++;
}
//这个循环是先加值再加日期,所以2020.1.10号的已经加上去了,但是2000.1.1没加上,所以加2
ans+=2;
System.out.println(ans);//8879
}
}
17.大数类的操作
(50条消息) 算法竞赛中的常用JAVA API :大数类_GD_ONE的博客-CSDN博客
18.数列求和
(50条消息) 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可_执梗的博客-CSDN博客
这道题的目的并不是要让大家去用什么大数据类型处理,要去分析题意!这个数之大肯定是无法用数字表示的,而题目只要求我们最后4位数字——更加说明所以这道题根本不需要去大数据处理!题目只关心最后四位数字,而前面的数字根部不会影响后面的数字,所以当我们的数字大于4位数时,我们只保留它的后四位即可。这样子可以大大减少时间的消耗提高速度!!
public static void main(String[] args) {
int a=1;
int b=1;
int c=1;
int ans=0;
for (int i = 4; i <= 20190324; i++) {
ans=a+b+c;
if(ans>10000)
ans=ans%10000;
a=b;
b=c;
c=ans;
}
System.out.println(ans);
}
19.k倍区间 子串分值
K倍区间:
一看到区间的和 就要想到前缀和!!
然后根据记忆同余定理:
(50条消息) 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可_执梗的博客-CSDN博客
子串分值:
题目分析:这道题是可以暴力做的,可以拿到60分。每次计算以S[i]为字符串的头往后遍历计算可以获得的分数。对于S[i,j]的子数组中只出现一次的元素我们可以通过S[i,j-1]去获得,用不着每次都遍历。这里我用一个Set去记录只出现一次的元素,再用一个Set记录重复出现过的元素(感觉可以优化但是没有去优化)
public class 子串分值 {
//过了6个得了六十分
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s=sc.next();
int count=0;
int n=s.length();
for(int i=0;i set1=new HashSet<>();
//放多次出现的字符
Set set2=new HashSet<>();
set1.add(s.charAt(i));
for(int j=i+1;j
20.进制转换
输出16进制这种存在字母的一定要看题目样例输出是大写还是小写,从调用String类的大小写函数来进行修改。
低精度的我们可以用
// 如果题目要进行转化的进制在2~36之间的话直接调用库函数就行了。
String s = in.readLine();
int a = Integer.parseInt(s, 16) // 将16进制的字符串转化十进制数
//BigInteger a = new BigInteger(s, 16);// 高精度数
out.write(Integer.toString(a, 8)); // 转化为8进制输出
//out.write(a.toString(8));
out.flush();
高精度的可以用 大数类无敌!
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
BigInteger n=new BigInteger(str,16);//将十六进制转换为10进制
System.out.println(n.toString(10));//将n以十进制输出
21.位运算
(49条消息) 算法很美1.1 位运算_我叫lxc的博客-CSDN博客
主要用途如下:
1.判读奇偶 &1 最低位为0则说明该数字为偶数,最低位为1则说明该数字为奇数
2.获取二进数第n位是0还是
2.1将第n位右移到第一位,然后与1相与即可
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
System.out.println(Integer.toString(n, 2));
if((n&1)==0)
System.out.println("偶数");
System.out.print(n+"的第"+x+"位二进制数是");
System.out.println((n>>(x-1))&1);
22.//1MB=1024KB=1024B,32位二进制整数是4字节,即4B
23.对数组进行排序
Arrays.sort(nums);//对数组进行排序
24.二分法专题
第 8 节 三种二分查找模板对比 | 算法吧 (suanfa8.com)
25.时间显示
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取
了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时
刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要
显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
这是去年JavaB组省赛的第一道大题,有的人一看到就来一句——卧槽!这么难?从1970年开始那得有多少毫秒?算了算了先看下一题。但是大家要想一下? 题目求的是什么?是今天的时分秒!我们不需要去关心今天是多少年多少月多少日,所以我们有下面的这几步思考步骤:
设接收到的总毫秒数为n。
1.首先先n=n/1000。因为n的单位是毫秒,我们需要的最低精准单位是秒,而1s=1000ms,所以不足一秒的毫秒我们直接舍去,此时n的单位变成了秒
2.进行操作n=n%(60*60*24)。因为我们只关心今天走了的时间,也就是今天走了多少秒,我们对一整天的秒数进行取余,则获得的就是未满一天的秒数,也就是今天的
3.long hour=n/3600;因为我们已经获得了今天的秒数,1h=3600s,我们算出n可以整除出多少个3600,则就是多少个小时,由此得到了今天的小时数。
4.n%=3600;long month=n/60;我们先对n%3600是为了得到剩下未满一个小时的秒数,也就是分加上秒的,我们对n取余60,就能得到分钟的值。
5.n%=60; long s=n;同理于分,先取余60,剩下的n就是我们最后的秒数了。
import java.util.Scanner;
public class 时间显示 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long n=sc.nextLong();
//拿到的是毫秒,先转换为秒,1m等于1000ms
n=n/1000;
//现在拿到的是秒,对一天的秒数取余即可获得今天的秒数
n=n%(60*60*24);
//现在拿到的是一天的秒数,开始转化为答案,一小时有3600秒,先获得秒
long hour=n/3600;
//现在获得分钟加分
n%=3600;
//再获得分钟
long month=n/60;
//再获得秒
n%=60;
long s=n;
//这里涉及输出格式,大家可以学习一下printf的输出格式
System.out.printf("%02d:%02d:%02d",hour,month,s);
}
}
26.printf的输出格式
System.out.printf("%02d:%02d:%02d",hour,month,s);
可以将hour month s 小于等于10的进行补加前导“0”
27.快速幂
//快速幂函数,赋值照用即可
static long qmi(long a,int k,int p) {
long res=1;
while(k>0) {
//这样判断k的二进制最后一位是否是1
if((k&1)==1) res=res*a%p;
k>>=1;
a=(long)a*a%p;
}
return res;
}
28.关于大数类
b=b.add(a) 才相当于 b++ !!!!!!!!!!!!!!!!
b.intValue ------------------>转换为int类型 注意是否溢出
for (BigInteger b=new BigInteger("1");b.intValue()<=n; b=b.add(a)) {
if((w.mod(b).intValue())!=0) {
F=true;
break;
}
}