2018微软秋招JAVA面试题(前两题)

1.艾玛想在父亲生日那天送一束花给他,并向母亲求助。母亲给了艾玛N根编号为1到N的花束,让她按照特定的顺序排列好。母亲让艾玛把第K根花枝按其长度增加的顺序排列,其余的花枝按其长度减少的顺序排列。
编写一个算法来找到Emma将花束送给父亲的花茎的最终排列。
输入:方法的输入由三个参数组成,num是一个整数,表示花棍的数量(N)。random,一个整数代表母亲给艾玛花束的数字K,一个整数列表代表花朵枝条的长度。
输出:返回一个整数列表,该列表表示Emma将花束送给父亲的花束的最终样式。
约束:random <num ;0<num <106
例子:
输入:
num=8
random=3
sticks=[11,7,5,10,46,23,16,8]
输出:
[5,7,11,46,23,16,10,8]
思路:数组的排序

import java.util.Scanner;
public class Main {
 public static void main(String[] args)
 {
 //简化了输入形式 可自己修改
	 Scanner sc=new Scanner(System.in);
	 int num=Integer.parseInt(sc.next());
	 int random=Integer.parseInt(sc.next());
	 String sStick=sc.next();
	 String[] sSticks=sStick.split(",");
	 int[] sticks=new int[num];
	 for(int i=0;i<num;i++)
	 {
		 sticks[i]=Integer.parseInt(sSticks[i]);
	 }
	 quickSort(sticks,0,random-1,true);
	 quickSort(sticks, random, num-1, false);
	 
	 for(int i=0;i<num-1;i++)
	 {
		 System.out.print(sticks[i]+",");
	 }
	 System.out.print(sticks[num-1]);
 }
 /****************
  * 快速排序算法 递归实现
  * @param array 需要进行排序的数组
  * @param begin 数组开始位置
  * @param end 数组结束位置
  * @param isAsc 是否按照升序进行排序
  */
 public static void quickSort(int[] array,int begin,int end,boolean isAsc)
 {
	 //循环退出条件
	 if(begin>=end)
	 {
		 return;
	 }
	 
	 int left=begin;//本次排序左侧开始位置下标
	 int right=end;//本次排序右侧结束位置下标
	 int key=array[left];//本次排序所用的比较元素
	 
	 //(升序时)一次排序完成后 所有大于比较元素的数都在比较元素之后,小于的都在比较元素之前
	 //当左侧位置下标不等于右侧位置下标时,循环
	 while(left<right)
	 {
		 if(isAsc) {//升序排列
			 //查找右侧第一个小于key值的元素位置
			 while(left<right&&(key<=array[right]))
			 {
				 right--;
			 }
			 array[left]=array[right];//交换位置
			 //查找左侧第一个大于key值的元素位置
			 while(left<right&&(key>=array[left]))
			 {
				 left++;
			 }
			 array[right]=array[left];//交换位置
		 }
		 else {//降序排列
			 //查找右侧第一个
			 while(left<right&&(key>=array[right]))
			 {
				 right--;
			 }
			 array[left]=array[right];
			 while(left<right&&(key<=array[left]))
			 {
				 left++;
			 }
			 array[right]=array[left];
		}
	 }
	 //left==right时,退出循环
	 array[left]=key;//将key值放入合适位置
	 
	 quickSort(array, begin, left-1, isAsc);//对左侧进行排序
	 quickSort(array, left+1, end, isAsc);//对右侧进行排序
 }
}
  1. 一家公司决定在圣诞节给员工发奖金。公司的办公室有N层,座位有等级结构,每个员工最多领导两个下属。公司的首席执行官在办公室的顶层办公。每个下属的座位都比他/她的主管低一层。一个下属坐在主管的左边,另一个坐在主管的右边。在发放奖金的过程中,每个员工总是先给自己的下属发放奖金(如果有的话),然后才领取自己的奖金。坐在右边的下属比坐在左边的下属先获得奖金。支付经理想知道奖金发放的顺序。
    写一个算法来帮助经理计算奖金分配的顺序。
    输入:函数的输入由三个部分组成numEmployee,一个代表公司员工人数的整数;floors,一个代表公司的楼层数(N)的整数。subordinates,一个整数列表,表示一个员工的每个下属的座位,其中第i个员工的左下属和右下属分别为2i和2i+1;
    输出:返回表示排序序列的整数列表。
    约束:1<=numEmployee<=106
    2<=subordinates[i]<=numEmployee
    0<=i<=2floores-1
    1<=floors<32
    Subordinates[0]=1
    Note:如果subordinate[i]=-1证明此位置员工不存在。
    公司内的每一个员工都有一个唯一的ID。CEO的ID树总是为1且其链的起点
    Example:
    Input:
    numEmployee=4
    floors=3
    subordinates=[1,2,3,-1,-1,4,-1,-1,-1]
    Output:
    [4,3,2,1]
    解释:CEO(1)要求他的下属(3)拿奖金。(3)没有右边的下属,所以他让左边的下属(4)拿奖金,因为(4)和(3)已经收到了奖金,CEO(1)把奖金给了左边的下属(2)。员工获得奖金的顺序是4.3.2.1
    思路:二叉树的数组表示形式(完全二叉树) 二叉树的遍历
    一点疑问:没太看懂这题目,如果floors=3的话,那么subordinates不应该只有7个数据吗?完全二叉树节点个数2`n-1,题目中给出了九个,希望有大佬看到
public class Main { 
	
 public static void main(String[] args)
 {
	 Scanner sc=new Scanner(System.in);
	 int numEmployee=Integer.parseInt(sc.next());
	 int floors=Integer.parseInt(sc.next());
	 String sSubordinate=sc.next();
	 String[] sSubordinates=sSubordinate.split(",");
	 
	 int nodeNum=(int)Math.pow(2, floors);//n层总结点数量为2`n-1,第一个存储位置不用,分配2`n个位置
	 int[] subordinates=new int[nodeNum];
	 for(int i=1;i<nodeNum;i++)
	 {
		 subordinates[i]=Integer.parseInt(sSubordinates[i-1]);
	 }
	 
	 postorderTraversal(subordinates, 1);
	/* for(int i=0;i<numEmployee-1;i++)
	 {
		 System.out.print(array[i]+",");
	 }
	 System.out.print(array[numEmployee-1]);*/
 }
 /***************
  * 对数组表示形式的完全二叉树进行右子树 左子树 根节点遍历
  * @param subordinates 进行遍历的完全二叉树数组
  * @param curIndex 当前遍历位置
  */
 public static void postorderTraversal(int[] subordinates,int curIndex)
 {
	 //循环结束条件 遍历位置不存在
	if(curIndex>subordinates.length-1)
	{
		return;
	}
	postorderTraversal(subordinates, 2*curIndex+1);//右侧下属
	postorderTraversal(subordinates, 2*curIndex);//左侧下属
	
	if(subordinates[curIndex]!=-1)
		System.out.print(subordinates[curIndex]+" ");
 }
}

猜你喜欢

转载自blog.csdn.net/weixin_43823363/article/details/86710438