蓝桥杯的学习笔记——一只小菜鸟(更新中)

蓝桥杯备赛——菜鸟笔记

本人对于算法竞赛经验不够丰富,蓝桥是第二次参加,去年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
数据规模和约定
  输入数据中每一个数的范围。
  输入数据必须满足4
i+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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值