【蓝桥杯2020Java】七段码。通俗易懂

七段码

在这里插入图片描述
这道题我只能说:一定要细心,我写了差不多有一个小时(不是在考场),写代码之前一定要有思路啊,要不写的时候很麻烦!我这里给的思路就是,用Map保存key(字母)和value(key字母可以连通的字母),总共七个字母,所以也好写。然后有以下几点

  • 如何求字符串的所有子集----------------递归
  • 如何判断连通区域-------------------------bfs

所以简化成这样之后去理解题目就轻松很多了。我这里使用bsf判断十分是连通区域,大家也可以用dfs判断。

public class Main{
	static int counts=0;
	static Set<String>set=new HashSet<>();
	static Map<String,ArrayList<String>>map=new HashMap<>();
	public static void main(String[] args) {
		String str="abcdefg";
		//初始化
		ArrayList<String>list1=new ArrayList<>();
		ArrayList<String>list2=new ArrayList<>();
		ArrayList<String>list3=new ArrayList<>();
		ArrayList<String>list4=new ArrayList<>();
		ArrayList<String>list5=new ArrayList<>();
		ArrayList<String>list6=new ArrayList<>();
		ArrayList<String>list7=new ArrayList<>();
		list1.add("b");list1.add("f");
		list2.add("a");list2.add("g");list2.add("c");
		list3.add("b");list3.add("g");list3.add("d");
		list4.add("c");list4.add("e");
		list5.add("f");list5.add("g");list5.add("d");
		list6.add("a");list6.add("g");list6.add("e");
		list7.add("f");list7.add("e");list7.add("b");list7.add("c");
		map.put("a", list1);
		map.put("b", list2);
		map.put("c", list3);
		map.put("d", list4);
		map.put("e", list5);
		map.put("f", list6);
		map.put("g", list7);
		
		//求字符串的所有字串
		find("",str,0);

		System.out.println(counts);
	}
	static void find(String temp,String str,int index) {
		if(index==str.length()) {
			//最后对得到的字串检查是否是一个连通区域
			if(bfsCheck(temp.toCharArray()))counts++;
			return;
		}
		find(temp,str,index+1);
		find(temp+=str.charAt(index),str,index+1);
	}
	static boolean bfsCheck(char[] strs) {
		//先对简单情形直接判断
		if(strs.length==0)return false;
		if(strs.length==1)return true;
		if(strs.length==2) {
			if(map.get(strs[0]+"").contains(strs[1]+""))return true;
			else return false;
		}
		LinkedList<String> queue=new LinkedList<>();
		int connect=1;
		queue.add(strs[0]+"");
		strs[0]='0';
		while(!queue.isEmpty()) {
			String str  = queue.poll();
			ArrayList<String> list = map.get(str);
			for(int i=0;i<strs.length;i++) {
				if(list!=null&&list.contains(strs[i]+"")) {
					connect++;
					queue.add(strs[i]+"");
					strs[i]='0';
				}
			}
		}
		if(connect==strs.length)return true;
		return false;
	}
}

答案80

然后就是提供别人的思路

public class Main {
    static int N = 100000 * 4 + 5;
    static int M = 1000 + 5;
    static int mod = 1000000009;
    static Scanner cin = new Scanner(System.in);
     
    static int ans = 0, n, m;
    static ArrayList<Integer> g[] = new ArrayList[N]; //建图 第i个数组的元素都跟i相连
    static boolean vis[] = new boolean[N]; //判断当前这条线段是否被递归过
    static boolean dp[] = new boolean[N]; //二进制判重
    static int a[] = new int[1<<8];
    
    public static void main(String[] args) {
    	for(int i = 1; i <= 7; i++)
    		g[i] = new ArrayList<Integer>();
    		//这里就是赋予数字意义 重新连边
    	add(1, 2); add(1, 6); add(2, 7); add(2, 3); add(3, 4); 
    	add(4, 5); add(5, 6); add(5, 7); add(6, 7); add(3, 7);
    	for(int i = 1; i <= 7; i++) {
    		vis[i] = true; //这里枚举是保证至少有一条灯管是亮着的
    		dfs(i , 1);
    		vis[i] = false;
    	}
    	System.out.println(ans);
	}

	private static void dfs(int u, int k) {
		a[k] = u;  //递归的第k条线段是数字编号为u的线段
		check(k); //对每个状态都判重
		//这里从1枚举到k就是枚举当前联通块相连的边
		for(int i = 1; i <= k; i++) {
			for(int v: g[a[i]]) { 
				if(vis[v]) continue;
				vis[v] = true;
				dfs(v, k + 1);
				vis[v] = false;
			}
		}
	}

	private static void check(int k) {
		int res = 0;
		for(int i = 1; i <= k; i++) //因为每个线段的数字不同 代表的二进制数字也就不同
			res += (1<<a[i]);
		if(dp[res]) return;
		dp[res]  = true;
		ans++;
	}

	private static void add(int i, int j) {
		g[i].add(j); g[j].add(i);
	}
}
  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Java面经是指在面试过程中常被问到的与Java相关的问题和知识点。下面是一些常见的Java面经问题及其解答: 1. Java的特点是什么? Java是一种面向对象的编程语言,具有跨平台性、简单性、可靠性、安全性和高性能等特点。 2. 什么是Java虚拟机(JVM)? JVM是Java程序运行的环境,它负责将Java源代码编译成字节码,并在不同的操作系统上执行。 3. 什么是面向对象编程(OOP)? 面向对象编程是一种编程范式,它将数据和操作数据的方法封装在一起,通过创建对象来实现程序的功能。 4. Java中的四种访问修饰符分别是什么? Java中的四种访问修饰符分别是public、protected、default和private,用于控制类、方法和变量的访问权限。 5. 什么是Java中的异常处理机制? 异常处理机制是Java中用于处理程序运行过程中出现的异常情况的一种机制,通过try-catch-finally语句块来捕获和处理异常。 6. 什么是Java中的多线程? 多线程是指在一个程序中同时执行多个线程,每个线程都可以独立执行不同的任务,提高程序的并发性和效率。 7. 什么是Java中的集合框架? 集合框架是Java中用于存储和操作一对象的类库,包括List、Set、Map等常用的数据结构和算法。 8. 什么是Java中的反射机制? 反射机制是指在运行时动态地获取和操作类的信息,可以通过反射来创建对象、调用方法和访问属性等。 9. 什么是Java中的IO流? IO流是Java中用于输入和输出数据的一种机制,包括字节流和字符流,用于读取和写入文件、网络等数据源。 10. 什么是Java中的设计模式? 设计模式是一种解决常见软件设计问题的经验总结,包括单例模式、工厂模式、观察者模式等常用的设计模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值