1、今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。请你通过编写程序,求出一组人中的队长是原来第几位同学。
package com.day05.homework5;
import java.util.Scanner;
public class Captain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("总共有几位同学:");
int num = scanner.nextInt();
//定义一个数组
boolean[] student =new boolean[num];
//数组长度
int numbers = student.length;
int count=0;//存储报数
int index=0;//存储索引下标
//全部排号为true
for (int i = 0; i <student.length; i++) {
student[i]=true;
}
/*
* 开始从1报数
* 如果该同学报数为3,那么报数count清为0,该学生排号为false,并退出圈子,人数numbers-1,继续下一轮报数
* 如果报数到最后一位学生,从头开始
*/
while (numbers>1) {
//如果排号为true的,报数+1
if (student[index] ==true) {
count++;
}
if (count==3) {
count=0;
student[index]=false;
numbers--;
}
index++;
if (index==num) {
index=0;
}
}
//循环遍历找到排号没有变为false的学生为队长
for(int i=0;i<student.length;i++) {
if(student[i]==true) {
System.out.println("队长是第"+(i+1)+"位同学");
}
}
}
}
2、查找某个整数定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输入一个整数,查找此整数,找到输出下标, 没找到给出提示。
package com.day05.homework5;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
System.out.println("请输入10个整数:");
int [] nums = new int[10];
for (int i = 0; i < nums.length; ) {
System.out.println("第"+(i+1)+"个数字:");
if (scanner.hasNextInt()) {
nums[i] = scanner.nextInt();
i++;
}else {
System.out.println("请输入一个整数");
}
}
int index=0;//存储下标
System.out.println("输入你要找的数字");
int num2 = scanner.nextInt();
for (int i = 0; i < nums.length; i++) {
if (num2==nums[i]) {
index = i;
//System.out.println("该数字的下标为:"+index);
break;
}else {
index=-1;
}
}
if (index!=-1) {
System.out.println("该数字的下标为:"+index);
}else {
System.out.println("数字不存在");
}
}
}
3 、找出数组的最值定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组的最大值、最小值。
package com.day05.homework5;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
int [] nums = new int[10];
Scanner scanner = new Scanner(System.in);
System.out.println("请输入10位数:");
for (int i = 0; i < nums.length; i++) {
System.out.println("请输入第"+(i+1)+"个数字");
if (scanner.hasNextInt()) {
nums[i]=scanner.nextInt();
}else {
System.out.println("请输入一个整数:");
}
}
int max=nums[0];
int min=nums[0];
for (int i = 1; i < nums.length; i++) {
if (max<nums[i]) {
max=nums[i];
}
if (min>nums[i]) {
min=nums[i];
}
}
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
}
4 、两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并输出他们的数组下标,假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以输出 0,1
package com.day05.homework5;
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
System.out.println("请输入4个整数:");
int [] nums = new int[4];
for (int i = 0; i < nums.length;) {
System.out.println("第"+(i+1)+"个数字:");
if (scanner.hasNextInt()) {
nums[i] = scanner.nextInt();
i++;
}else {
System.out.println("请输入一个整数");
}
}
System.out.println("请输入目标值:");
int target=0;
if (scanner.hasNextInt()) {
target = scanner.nextInt();
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
if (nums[i]+nums[j]==target) {
System.out.println("两个数相加等于目标值的下标分别为:");
System.out.println(i+","+j);
break;
}
}
}
}else {
System.out.println("请正确输入一个整数");
}
}
}
5、排序并查找对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 输入目标值 并输出排序后的下标。
package com.day05.homework5;
import java.util.Scanner;
public class Demo4 {
public static void main(String[] args) {
int [] nums={
1,3,9,5,6,7,15,4,8};
int temp=0;
/**
* 数组排序
*/
//外层循环轮数
for (int i = 0; i < nums.length-1; i++) {
//每轮比较次数
for (int j = 0; j < nums.length-i-1; j++) {
if (nums[j]>nums[j+1]) {
temp =nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
//遍历数组
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+",");
}
/**
* 使用二分法查询目标值
*/
System.out.println();
System.out.println("请输入你要查询的数据:");
Scanner scanner = new Scanner(System.in);
//存储输入目标值
int target=0;
if (scanner.hasNextInt()) {
target = scanner.nextInt();
}else {
System.out.println("请正确输入一个整数");
}
int minIndex=0;//最小下标
int maxIndex=nums.length-1;//最大下标
int centerIndex=(maxIndex+minIndex)/2;//中间下标
while (true) {
if (nums[centerIndex]>target) {
maxIndex=centerIndex-1;
}else if (nums[centerIndex]<target) {
minIndex=centerIndex+1;
}else {
break;
}
if (minIndex>maxIndex) {
centerIndex=-1;
}
centerIndex=(maxIndex+minIndex)/2;
}
if (centerIndex!=-1) {
System.out.println("值的下标为:"+centerIndex);
}
}
}
6、移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
package com.day05.homework5;
public class Demo5 {
public static void main(String[] args) {
int[] nums={
0,34,0,3,12};
int temp=0;
/**
* 数组排序
*/
//外层循环轮数
for (int i = 0; i < nums.length-1; i++) {
//每轮比较次数
for (int j = 0; j < nums.length-i-1; j++) {
if (nums[j]>nums[j+1]) {
temp =nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
//遍历数组
for(int i=0;i<nums.length;i++){
System.out.print(nums[i]+" ");
}
System.out.println("");
System.out.println("移动后如下:" );
for(int i=0;i<nums.length;i++){
if (nums[i]==0) {
int j=i+1;//非0数字的下标
while (j<nums.length) {
if (nums[j]!=0) {
nums[i]=nums[j];
nums[j]=0;
break;
}else {
j++;
}
if (j==nums.length) {
break;
}
}
}
System.out.print(nums[i]+" ");
}
}
}