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);//对右侧进行排序
}
}
- 一家公司决定在圣诞节给员工发奖金。公司的办公室有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]+" ");
}
}