蓝桥杯备赛——菜鸟笔记
本人对于算法竞赛经验不够丰富,蓝桥是第二次参加,去年JavaB省二,没进国赛的小渣渣,今年不甘心,再来一遍,争取好好准备,预祝我逆袭成功!
几个月前浅浅地学习过一点算法,先再复习一遍。
没有什么难易顺序,在刷题的过程中碰到什么知识点我就记录一下~
先回顾java重要的一部分知识——String类型及其函数
String类型真的很重要!!我比赛的时候靠着一个知识点解出来了2个题(当然要配合其他知识使用)
String 类
定义什么的就很简单了
直接String str = “abc”;或者使用构造方法如下,
public String(String original);
public String(byte[] bytes);
public String(byte[] bytes, int offset, int length);
public String(byte[] bytes, String charsetName);
public String(char[] value);
public String(char[] value, int offset, int count);
String 常用的函数
int length(); //返回字符串中字符的个数
char charAt(int index);//返回序号index处的字符
String substring(int begin, int end);//返回接收者对象中序号从begin开始到end-1的子字符串
String concat(String s);//返回接收者字符串与参数字符串s进行连接后的字符串
做题的时候碰到了format函数,来复习一下~
double num;
String str = String.format("%.0f",num);//四舍五入的保留小数
//这样是取整
目前经常遇到的format函数格式转换符:
%f 浮点型
%s 字符串
%c 字符
%b 布尔
%d 整数
利用String类型对这些类型进行格式化,同时能实现把一些不同类型的数据组
合并统一成String类型。
自己编了一个小例子:
String str=String.format("我叫%s,今年%d岁,我数学考了%.2f分"
",等级是%c,我说的都是%b的!","小高",20,99.5,'A',1);
System.out.println(str);
还挺有意思哈
**基本数据类型的封装类
**
构造方法
Double类的构造方法: Double(double num)
Float类的构造方法:Float(double value)
Byte 类的构造方法:Byte(byte value)
Integer类的构造方法:Integer(int value)
Short类的构造方法:Short(short value)
Long类的构造方法:Long(long value)
Character 类的构造方法: Character(char value)
大小写转换
char a = 'h';
Character.isLowerCase(a);
Character.isUpperCase(a);//判断大小写
Character.toUpperCase(a);
Character.toLowerCase(a);//转换大小写
举个例子
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
char s[]=str.toCharArray();
for (int i = 0; i < s.length; i++) {
if(Character.isUpperCase(s[i])) {
s[i]=Character.toLowerCase(s[i]);
}
else if(Character.isLowerCase(s[i])) {
s[i]=Character.toUpperCase(s[i]);
}
//System.out.println(s[i]);
}
//str = s.toString(); 注意: 字符串转换成char数组不能用toString(); 转换以后是结果为[类型@哈希值]
str = String.valueOf(s);
System.out.println(str);
}
基本类型<---->包装类的转换
int x= Integer.parseInt(String);
double y=Double.parseDouble(String); //String-->int or double
Integer t2 = Integer.valueOf(“300”); //String-->int
int i=123;
String s1 = Integer.toString(i); //int -->String
int i = 500;
Integer t1 = new Integer(i); //int -->Integer
int j1 = t1. intValue() ; //Integer-->int
j1 = 500;
基本的集合接口
1.collection接口
Set接口 ——不允许有重复元素
- HashSet
- TreeSet
List接口——允许重复,且有索引
- ArrayList (类似数组)
- LinkedList(类似链表)
2.Arrays类
3.Map接口——键值对
HashMap类
TreeMap类
注意:Map中的key-value,在同一个Map中,key不可重复
具体用法如下:
二分查找的递归运算
题目:
问题描述
用递归函数实现二分法查找数组元素。
补充:要求给定数组采用如下代码定义
int data[200];
for (i=0; i<200; i++)
data[i]=4i+6;
输入格式
输入一个待查找的整数(该整数一定在数组data中)。
输出格式
该整数在数组中的指标。
样例输入
一个满足题目要求的输入范例。
例1:
262
例2:
438
例3:
774
样例输出
与上面的样例输入对应的输出。
例1:
64
例2:
108
例3:
192
数据规模和约定
输入数据中每一个数的范围。
输入数据必须满足4i+6,i=0,1,2,3,…,198,199。
代码:
import java.util.Scanner;
public class Main {//注意蓝桥在提交代码时,主函数名必须是Main
public static void main(String[] args) {
int x;
int data[] = new int [200];
for (int i=0; i<200; i++)
data[i]=4*i+6;
Scanner sc = new Scanner(System.in);
x=sc.nextInt();
int t = BinaryFind(data,x,0,199);
System.out.println(t);
}
//数组名、带查找元素,左边界,右边界
//脑子里面可以画画图
public static int BinaryFind(int a[],int x,int left,int right) {
// if(left>right) return -1;
int middle=(left+right)/2;
if(x==a[middle])
{
return middle;
}
else if(x<a[middle])
{
return BinaryFind(a, x,left, middle-1);
}
else if(x>a[middle])
{
return BinaryFind(a, x, middle+1,right);
}
return -1;
}
}
排序算法
1.选择排序
思路:选择出最小的(或最大的)放在指定位置。
//有n个元素的数组
for(int i=0;i<n;i++){
int temp=i;
for(int j=i+1;j<n;j++){
if(a[temp]<a[j]){
temp=j;//记录最大的元素下标
}
}
//交换
int t=a[i];
a[i]=a[temp];
a[temp]=t;
}
在这里可以把i,j理解为数组中的两个不同的位置,以i为一固定位置的元素,取其后元素最小者与之交换。
2.冒泡排序
思路:比较相邻两元素,目的是把较大的元素放在数组的末尾位置。
for (int i = 0; i < n; i++) {//循环n次
for (int j = 0; j < n-i-1; j++) {
if(a[j]>a[j+1]) {
//交换
int t= a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
冒泡排序中的i我把它理解为循环的次数,j则是每次循环到的元素,从数组头到上次循环到的最后一个元素(第n-i-1)。
3 求最小公倍数最大公约数
首先明确一下他们的关系(假设两个数分别为a,b):
最小公倍数=(a*b)/最大公约数
所以问题的关键就是求出a,b的最大公约数,也就是一个能同时被a,b整除的数。方法如下:
// 先保证a>b:
if(a<b) {
int temp=a;
a=b;
b=temp;
}
// 求a,b的余数c
int c = a%b;
// 辗转相除
while(a%b!=0) {
// 分母成分子,余数成分母
a = b;b = c;
c=a%b;
}
// 最后保留分母b为最小公倍数
小菜鸟做题做不动了,做点简单的吧还是
今天发现题里面有好多坑啊
问题描述
编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法)、“-”(减法)、“*”(乘法)或“/”(除法),运算对象为不超过10的整数,它们之间用一个空格隔开。要求:对于加、减、乘、除这四种运算,分别设计相应的函数来实现。
输入格式:输入只有一行,即一个前缀表达式字符串。
输出格式:输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果为整数)。
输入输出样例
基本思路很简单:
String str=sc.nextLine();读入一串字符串(含空行),比如"+ 5 2",将其中operator和数字用String s []=str.split(" ");分割,注意返回的是String数组。
然后就是类型转换,+ - * /就可以了。
问题在于要注意判断a b是否>10,好多这种范围问题,我已经错了好几次了T^T