BUPT2017计院机试Java题解

题目搜集于各位前辈,侵删。

第一题

在这里插入图片描述

import java.util.Scanner;
//签到题,直接用pow(x,1.0/3.0)好像有问题,要是卡时间就用这个
public class c1701 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int t=0;t<T;t++) {
			int n = sc.nextInt();
			int count = 0;
			for(double i = 1;i<=n;i++) {
				int k = (int)Math.sqrt(i);
				if(k*k == i) {
					for(double j = 1;j<=k;j++) {
						if(j*j*j == i) {
							count++;
							break;
						}
					}
				}
			}
			System.out.println(count);
		}
		sc.close();
	}

}

第二题

在这里插入图片描述
在这里插入图片描述

import java.util.Scanner;
//难度不高,就是太麻烦
public class c1702 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[] arr = new int[n+1];
		for(int i = 1;i<=n;i++) {
			arr[i] = sc.nextInt();
		}
		for(int i = 0;i<m;i++) {
			int k = sc.nextInt();
			int l = sc.nextInt();
			int r = sc.nextInt();
			if(k==1) {
				for(int j = 0;j<=(r-l)/2;j++) {
					int temp = arr[l+j];
					arr[l+j] = arr[r-j];
					arr[r-j] = temp;
				}
			}else if(k==2) {
				int len = sc.nextInt();
				for(int j = 0;j<len;j++) {
					int temp = arr[l+j];
					arr[l+j] = arr[r+j];
					arr[r+j] = temp;
				}
			}else if(k==3) {
				int x = sc.nextInt();
				for(int j = l;j<=r;j++) {
					arr[j] = x;
				}
			}else if(k==4) {
				for(int j = l;j<=r;j++) {
					for(int p = j+1;p<=r;p++) {
						if(arr[j]>arr[p]) {
							int temp = arr[j];
							arr[j] = arr[p];
							arr[p] = temp;
						}
					}
				}
			}else {
				int sum = 0;
				for(int j = l;j<=r;j++) {
					sum+=arr[j];
				}
				System.out.println(sum);
			}
			
//			for(int j = 1;j<=n;j++) {
//				System.out.print(arr[j]+"---");
//			}
//			System.out.println();
			
		}
	}

}

第三题

在这里插入图片描述

import java.util.Scanner;
/*
 *先把树建立起来,然后再后序遍历
 */
public class c1703 {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String nlr = sc.next();
		String lnr = sc.next();
		node root = new node(nlr.charAt(0)-'0');
		root.value = nlr.charAt(0)-'0';
		build(nlr,lnr,root);
		
		String ans = backSearch(root);
		System.out.println(ans);
	}

	
	static class node{
		int value;
		node left=null;
		node right=null;
		public node(int value) {
			super();
			this.value = value;
		}
		
	}
	
	static void build(String nlr,String lnr,node root) {
		
		if(nlr.length()==0) {
			return ;
		}
		
		int pos = 0;//找root在中序中的位置
		for(int i = 0;i<lnr.length();i++) {
			if(lnr.charAt(i)-'0'==root.value) {
				pos = i;
				break;
			}
		}
		
		String leftnlr = nlr.substring(1,1+pos);
		String leftlnr = lnr.substring(0,pos);
		if(leftnlr.length()!=0) {
			node leftroot = new node(leftnlr.charAt(0)-'0');
			root.left = leftroot;
			build(leftnlr,leftlnr,leftroot);
		}
		
		String rightnlr = nlr.substring(pos+1);
		String rightlnr = lnr.substring(pos+1);
		if(rightnlr.length()!=0) {
			node rightroot = new node(rightnlr.charAt(0)-'0');
			root.right = rightroot;
			build(rightnlr,rightlnr,rightroot);
		}	
	}
	
	static String backSearch(node root) {
		String l = "";
		String r = "";
		if(root.left!=null) {
			l = backSearch(root.left);
		}
		if(root.right!=null) {
			r = backSearch(root.right);
		}
		return l+r+String.valueOf(root.value);
	}
}

第四题

在这里插入图片描述

import java.util.Scanner;

/*
 * 找肯定是递归找,
 * 从四周扫描0?
 * 然后呢?中间的怎么办?
 * 中间的也递归?试试吧
 */
public class c1704 {

	static int countS = 0;
	static int count8 = 0;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int t=0;t<T;t++) {
			countS = 0;
			count8 = 0;
			int m = sc.nextInt();
			int n = sc.nextInt();
			int[][] arr = new int[m+1][n+1];//m行n列,留出0
			for(int i = 1;i<=m;i++) {
				for(int j = 1;j<=n;j++) {
					arr[i][j] = sc.nextInt();
				}
			}
			count(arr,1,1,m,n);
			System.out.println(countS+" "+count8);
			
		}
		sc.close();
	}

	static void count(int[][] arr,int m1,int n1,int m,int n) {
		if(m-m1<2||n-n1<1) {
			return ;
		}
		int up = 0;
		int down = Integer.MAX_VALUE;
		int left = 0;
		int right = Integer.MAX_VALUE;
		
		for(int i = 1;i<=m;i++) {
			int flag = 0;
			for(int j = 1;j<=n;j++) {
				if(arr[i][j]==1) {
					up = i;
					flag = 1;
					break;
				}
			}
			if(flag == 1) {
				break;
			}
		}
		for(int i = m;i>=1;i--) {
			int flag = 0;
			for(int j = 1;j<=n;j++) {
				if(arr[i][j]==1) {
					down = i;
					flag = 1;
					break;
				}
			}
			if(flag == 1) {
				break;
			}
		}
		
		for(int i = 1;i<=n;i++) {
			int flag = 0;
			for(int j = 1;j<=m;j++) {
				if(arr[j][i]==1) {
					left = i;
					flag = 1;
					break;
				}
			}
			if(flag == 1) {
				break;
			}
		}
		for(int i = n;i>=1;i--) {
			int flag = 0;
			for(int j = 1;j<=m;j++) {
				if(arr[j][i]==1) {
					right = i;
					flag = 1;
					break;
				}
			}
			if(flag == 1) {
				break;
			}
		}
		
		
		if(hasS(arr,up,down,left,right)) {
			countS++;
		}else if(has8(arr,up,down,left,right)) {
			count8++;
		}else {
			int updownMID = 0;
			for(int i = up;i<=down;i++) {
				int flag = 0;
				for(int j = left;j<=right;j++) {
					if(arr[i][j]==1) {
						flag = 1;
						break;
					}
				}
				if(flag == 0) {
					updownMID = i;
					break;
				}
			}
			
			int leftrightMID = 0;
			for(int i = left;i<=right;i++) {
				int flag = 0;
				for(int j = up;j<=down;j++) {
					if(arr[j][i]==1) {
						flag = 1;
						break;
					}
				}
				if(flag == 0) {
					leftrightMID = i;
					break;
				}
			}
			
			count(arr,up,updownMID,left,leftrightMID);
			count(arr,updownMID,down,left,leftrightMID);
			count(arr,up,updownMID,leftrightMID,right);
			count(arr,updownMID,down,leftrightMID,right);
			
		}
		
	}
	
	static boolean hasS(int[][] arr,int up,int down,int left,int right) {
		if((down-up)%2==1) {
			return false;
		}
		int mid = (up+down)/2;
		for(int i = up;i<=down;i++) {
			for(int j = left;j<=right;j++) {
				if(i==up||i==mid||i==down) {
					if(arr[i][j]==0) {
						return false;
					}
				}else if(j==left&&i<=mid) {
					if(arr[i][j]==0) {
						return false;
					}
				}else if(j==right&&i>=mid) {
					if(arr[i][j]==0) {
						return false;
					}
				}else {
					if(arr[i][j]==1) {
						return false;
					}
				}
			}
		}
		return true;
	}
	
	static boolean has8(int[][] arr,int up,int down,int left,int right) {
		if((down-up)%2==1) {
			return false;
		}
		int mid = (up+down)/2;
		for(int i = up;i<=down;i++) {
			for(int j = left;j<=right;j++) {
				if(i==up||i==mid||i==down||j==left||j==right) {
					if(arr[i][j]==0) {
						return false;
					}
				}else {
					if(arr[i][j]==1) {
						return false;
					}
				}
			}
		}
		return true;
	}

}

第四题还没测试,第一个样例太长了
不过应该算法没大问题,就是有些复杂

简单说一下我的算法,拿到一个矩阵,有长和宽
然后四个边向内压缩,遇到全是0的无效边剔除,最后得到up,down,left,right四个边(这四个边都含有1)
这个剩下的矩阵就有可能是S或者8
判断一次S,判断一次8,如果有,那就计数,如果没有,进行切割
从上往下找一行全0,叫做updownMID
然后从左往右找一行全0,叫做leftrightMID
一共得到up,updownMID,down,left,leftrightMID,right这六条边
这六条边就可以把这个大矩阵分成四个小矩阵,这四个小矩阵再循环判断。

大概就这样,看不懂的我写的,以及有好算法的,欢迎留言讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值