1.今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的规则。所有人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,剩下的人继续报数,最后留下的当选为队长。请你通过编写程序,求出一组人中的队长是原来第几位同学。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("有多少名学生:");
int[] stuAll = new int[input.nextInt()];
//创建的数组默认值都是0 所以必须得给每个值赋编号
for (int i = 0; i < stuAll.length; i++) {
stuAll[i] = i+1;
}
//计算到第几个数
int count = 0;
//剩余学生的人数
int sc=stuAll.length;
while(sc>1) {
for (int i = 0; i < stuAll.length; i++) {
if(stuAll[i]!=-1) {
count++;
}
if(count==3) {
//当数到3时 设置当前下标值为-1
stuAll[i] = -1;
sc--;
count = 0;
}
}
}
for (int i = 0; i < stuAll.length; i++) {
if(stuAll[i]!=-1) {
System.out.println(stuAll[i]);
}
}
}
2.给定一个数组nums,编写一个函数将所有0 移动到数组的末尾,同时保持非零元素的相对顺序。示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
(第一种方法)可以使用2个指针 while循环 2个指针下标同时从头开始 1号指针遇到0前进 2号指针等1号指针遇到不是0的将1号指针的值赋给2号指针 然后2个指针同时前进,可以将不是0的全部移动到前面
1号肯定比2号指针更早的到达终点 while循环结束的条件就是1号指针到达终点即不是0的已全部移动到前面 二号指针往后的肯定都是0
在用for循环对二号指针后的进行赋值 for(int i = 一号指针;i<num.length;i++) 赋值为0;就完成了
public static void main(String[] args) {
int[] num = {0,1,0,3,12};
int index1 = 0;
int index2 = 0;
while(index2<num.length) {
if(num[index2]!=0) {
num[index1]=num[index2];
index1++;
index2++;
}else {
index2++;
}
}
for (int i = index1; i < num.length; i++) {
num[i]=0;
}
for (int i = 0; i < num.length; i++) {
System.out.print(num[i]+"\t");
}
}
(第二种方法)可以使用冒泡方法
public static void main(String[] args) {
int[] num = {0,3,0,1,12};
int temp;
for (int i = 0; i < num.length-1; i++) { //轮数
for (int j = 0; j < num.length-i-1; j++) { //交换次数
if(num[j]==0) {
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
for (int i = 0; i < num.length; i++) {
System.out.print(num[i]+",");
}
}