0
点赞
收藏
分享

微信扫一扫

任务卡_01-Java基础语法_第5节 数组


目录

​​一,选队长游戏训练任务​​

​​描述​​

​​代码​​

​​二,流程控制的逻辑训练任务​​

​​1,查找某个整数​​

​​描述​​

​​代码​​

​​2,找出数组的最值​​

​​描述​​

​​代码​​

​​3,两数之和​​

​​描述​​

​​代码​​

​​4,排序并查找​​

​​描述​​

​​代码​​

​​5,移动零​​

​​描述​​

​​代码​​

一,选队长游戏训练任务

描述

今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举 一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的 规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数), 凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。 请你通过编写程序,求出一组人中的队长是原来第几位同学。

代码

package com.kaikeba.demo;

import java.util.Scanner;

public class Demo1 {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入总人数:");
int num = input.nextInt(); // 记录参与排队的总人数
int curNum = 0; // 当前剩余的人数
int ans = 0; // 存放队长编号(最后一个pass的人)
int[] record = new int[num + 1]; // 记录每个人报数序号(下标为编号 值为报数情况) 全为3时退出
for(int i = 1; i <= num; i++) { // 数组初始化
record[i] = 0;
}
int curIndex = 1; // 记录当前报的数
do {
curNum = 0; // 当前队列中剩余的人数 剩余人数为0时即找到队长
for(int i = 1; i <= num; i++) { // 队列中的人重新报数
if(record[i] != 3) { // 跳过报数为3的人(已被淘汰)
if(curIndex > 3) {
curIndex = 1; // 重新开始报数
}
record[i] = curIndex++; // 记录每个队员所报的数字 并且更新下一个要报的数
if(record[i] != 3) {
curNum++; // 当前队列中剩余的人数
}else {
ans = i; // 更新最后一个淘汰的人
}
}
}
}while(curNum > 0);
System.out.println("队长编号为:" + ans);
}
}

二,流程控制的逻辑训练任务

1,查找某个整数

描述

定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输 入一个整数,查找此整数,找到输出下标, 没找到给出提示。

代码

package com.kaikeba.demo;

import java.util.Scanner;

public class Demo2_1 {
/*
* 1,查找某个整数
* 定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。
* 然后将输 入一个整数,查找此整数,找到输出下标, 没找到给出提示
*/
public static void main(String[] args) {
int[] nums = {2, 7, 11, 15};
int ans = -1;

Scanner input = new Scanner(System.in);
System.out.print("请输入数组中的数:");
for(int i = 0; i < 10; i++) { // 初始化
nums[i] = input.nextInt();
}
System.out.print("请输入想要查找的数:");
int target = input.nextInt();
for(int i = 0; i < 10; i++) {
if(nums[i] == target) {
ans = i; // 找到目标数值的下标
break; // 停止查找
}
}
if(ans == -1) {
System.out.println("未找到" + target);
}else {
System.out.println("已找到" + target + ", 下标为" + ans);
}
}

}

2,找出数组的最值

描述

定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组 的最大值、最小值。

代码

package com.kaikeba.demo;

import java.util.Scanner;

public class Demo2_2 {
/*
* 2、找出数组的最值
* 定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组 的最大值、最小值。
*/
public static void main(String[] args) {
int[] nums = new int[10];
Scanner input = new Scanner(System.in);

System.out.print("请输入数组中的数:");
for(int i = 0; i < 10; i++) { // 初始化
nums[i] = input.nextInt();
}

int maxValue = nums[0], minValue = nums[0]; // 初始化为数组第一个元素
for(int i = 1; i < nums.length; i++) { // 遍历时从第二个数开始
if(nums[i] > maxValue) {
maxValue = nums[i]; // 更新最大值
}
if(nums[i] < minValue) {
minValue = nums[i]; // 更新最小值
}
}

System.out.println("原数组为:");
for(int i = 0; i < 10; i++) { // 重新展示数组
System.out.print(nums[i] + " ");
}
System.out.println();
System.out.println("最大值为:" + maxValue);
System.out.println("最小值为:" + minValue);

}

}

3,两数之和

描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为 目标值的那两个整数,并输出他们的数组下标 

假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。 

示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以输出 0,1

代码

package com.kaikeba.demo;

import java.util.Scanner;

public class Demo2_3 {

/*
* 3、两数之和
* #给定一个整数数组 nums 和一个目标值 target,
* #请你在该数组中找出和为 目标值的那两个整数,并输出他们的数组下标
*/
public static void main(String[] args) {
int[] nums = {1, 2, 7, 11, 15}; // 给定数组
Scanner input = new Scanner(System.in);

System.out.println("原数组为:");
for(int i = 0; i < nums.length; i++) { // 重新展示数组
System.out.print(nums[i] + " ");
}
System.out.println();

System.out.println("请输入和:");
boolean flag = false;
int target = input.nextInt();

// 寻找值
breakPoint:for(int i = 0; i < nums.length; i++) {
for(int j = i + 1; j < nums.length; j++) { // j从i+1开始 避免重复使用同一个值
if(nums[i] + nums[j] == target) { // 返回第一对满足要求的下标位置
System.out.print("满足条件的元素下标分别为:" + i + ", " + j);
flag = true; // 成功找到
break breakPoint; // 跳出最外层循环
}
}
}
if(flag == false) { // 未找到则给出提示
System.out.println("未找到满足要求的元素对");
}
}

}

4,排序并查找

描述

对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并 输出排序后的下标。

代码

package com.kaikeba.demo;

public class Demo2_4 {

/*
* 4、排序并查找
* #对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并 输出排序后的下标。
*/
public static void main(String[] args) {
int[] nums = {1, 3, 9, 5, 6, 7, 15, 4, 8}; // 给定的数组
for(int i = 0; i < nums.length; i++) { // 冒泡排序 n趟每趟确定一个最大值位置
for(int j = 0; j < nums.length - 1; j++) { // 总是比较相邻的元素 将较大元素向后移
if(nums[j] > nums[j + 1]) {
int tem = nums[j + 1]; // 交换
nums[j + 1] = nums[j];
nums[j] = tem;
}
}
}
System.out.println("排序后的数组为:");
for(int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + " ");
}
System.out.println();

int target = 6;
int left = 0, right = nums.length - 1; // 二分查找的左右界限
while(left < right) { // 出口条件
int mid = (left + right) / 2; // 中点位置
if(nums[mid] == target) { // 已找到 跳出循环
System.out.println("元素" + target + "的下标为:" + mid);
break;
}else if(nums[mid] < target) { // 目标值大于中点值 更新左边界
left = mid + 1;
}else { // 目标值小于中点值 更新右边界
right = mid - 1;
}
}
}

}

5,移动零

描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保 持非零元素的相对顺序。 

示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]

代码

package com.kaikeba.demo;

public class Demo2_5 {

/*
* 5、移动零
* #给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保 持非零元素的相对顺序
*/
public static void main(String[] args) {
int[] nums = {0, 1, 0, 3, 12, 1, 6, 8, 0}; // 给定的数组
int[] back = new int[nums.length]; // 调整后的数组
int index = 0; // 标记nums放入back中的位置
for(int i = 0; i < back.length; i++) { // back数组初始化为0
back[i] = 0;
}
for(int i = 0; i < nums.length; i++) { // 将nums里不为0的元素依次放入back中
if(nums[i] != 0) {
back[index++] = nums[i];
}
}

System.out.println("移动前的数组为:");
for(int i = 0; i < nums.length; i++) {
System.out.print(nums[i] + " ");
}
System.out.println();
System.out.println("移动后的数组为:");
for(int i = 0; i < back.length; i++) {
System.out.print(back[i] + " ");
}
System.out.println();
}

}

 

 

举报

相关推荐

0 条评论