[蓝桥杯 java 第十届 C组]

蓝桥杯 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将会把这两个合并,只储存一个空间。

详情戳:blog.csdn.net/jinqianwang…

链接:【substring的相关方法】

详情戳:www.w3school.com.cn/js/jsref_su…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享