蓝桥杯 java 第十届 C组
慢慢整理一些笔记,便于以后复习查阅。
第一题:
试题A:求和
本题总分: 5分[问题描述]
小明对 数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。
请问,在1到2019中,所有这样的数的和是多少?
思路:遍历数字,筛选出符合条件的数,相加得出答案。
基础方法解:
public static void main(String[] args) { //思路:利用长度字符求解,需要注意必须将原符全转换成字符才能正确运行
// TODO Auto-generated method stub
int ans=0;
for (int i=0;i<=2019;i++) //遍历。这个等于不要漏掉!
{
ans+=getNum(i); //写一个方法去判断
}
System.out.println(ans);
}
public static int getNum(int num) { //定义方法。把num传入判断
String str = String.valueOf(num); //valueof的作用:把各种类型转换成字符串String类型,只有字符串可以统计长度。
char[] a = new char[str.length()];
for(int i=0; i<a.length; i++) {
a[i] = str.charAt(i); //charAt为定位字符,i为几即第几位(位数从0开始的)
} //这步是把需要搜寻的数字赋值给a[i]
for(int i=0; i<a.length; i++) {
if(a[i]=='2'||a[i]=='0'||a[i]=='1'||a[i]=='9') //''给数字转换成字符串
return num;
}
return 0; //0,也是return false,则不返回
}
复制代码
暴力循环解:
public static void main(String[] args) {
// TODO Auto-generated method stub
int ans=0;
for(int i=1;i<=2019;i++){
int a=i; //i在循环变化,用字符a【代替它】进入单独的判断循环
while(a!=0){
int b=a%10;
if(b==2 ||b==0 || b==1 || b==9){
ans+=i; //判断完条件,把原本的数目i代入相加。不能还用a,因为循环判断位数时a/10了
break;
}
a/=10; //往前一个位数继续判断
}
}
System.out.println(ans);
}
复制代码
第二题:
试题B:矩形切割 本题总分: 5分
[问题描述]小明有一些矩形的材料,他要从这些矩形材料中切割出一-些正方形。
当他面对一.块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。例如,对于一块两边分别为5和3的材料(记为5×3),小明会依次切出3×3、2×2、1×1、1×1共4个正方形。
现在小明有一块矩形的材料,两边长分别是2019和324。请问小明最终会.切出多少个正方形?
思路:利用个数、余数辗转相除直到0
public static void main(String[] args) { //思路:利用个数、余数辗转相除直到0
// TODO Auto-generated method stub
int a=2019; //长
int b=324; //宽
int sum=0; //记录切割的个数
while(a!=0){ //写个死循环。括号内条件任意,能让循环执行就行
if(a>b) //用大边除以小边
{
sum+=a/b; //sum是int类型的,除不尽的小数不计入赋值 //这步记录裁剪个数
a=a%b; //这步记录余数
}
else
{
sum+=b/a;
b=b%a;
}
if(b==0||a==0) //定义一个退出死循环条件
{
break;
}
}
System.out.println("sum = " + sum);
}
复制代码
第三题:
试题C:不同子串 本题总分: 10分
[问题描述]
一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成.的串。例如,字符串aaab有非空子串a, b, aa, ab, aaa, aab, aaab,一共7个。注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?
思路:利用hashset能去除重复值的特性 和 substring切割 方法
// TODO Auto-generated method stub
String a="0100110001010001";
Set<String> b=new HashSet<String>(); //注意大小写.hashset可以去除重复数值,比ArrayList方便
for(int i=0;i<a.length();i++){
for(int j=i+1;j<=a.length();j++){
String c = a.substring(i,j); //substring切割出来
b.add(c);
}
}
System.out.println(b.size());
}
复制代码
链接:【hashset的相关方法 摘要】
HashSet是set接口的实现类,也是我们最常用的set集合
储存的是 无序,唯一的对象。由于是 无序 的所以每组数据都 没有索引,很多list可用的方法他都没有。
它的主要特点就是可以去除重复数据。
HashSet是是使用equals来进行对象对比,确定数据是唯一的。
如果两个数据的对象是一致的,那么HashSet将会把这两个合并,只储存一个空间。
链接:【substring的相关方法】