目录
一、流程控制的逻辑训练任务
1、查找某个整数
问题描述
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。 然后将输 入一个整数,查找此整数,找到输出下标, 没找到给出提示。
代码
public class Test_2 {
public static void main(String[] args) {
int t = 0;//判断目标数组下标的标记
Scanner input = new Scanner(System.in);
System.out.println("请输入10个整数:");
int[] nums = new int[10];//动态确定数组的个数
for(int i = 0; i < 10; i ++) {
nums[i] = input.nextInt();//动态对数组进行赋值
}
System.out.println("请输入一个整数:");
int n = input.nextInt();
for(int i = 0; i < 10; i ++) {
//判断数组中是否有这个整数
if(n == nums[i]) {
t = i;//将下标值赋值给t
System.out.println("整数 " + n + "在数组中下标为" + t);
//break; //这里不能加break,有可能数组中存在重复的数据,这些数据也需要遍历。
}
}
//判断数组中是否有这个整数
if(t == 0) {
System.out.println("数组中没有整数" + n);
}
}
}
运行结果:
2、找出数组的最值
问题描述
定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组 的最大值、最小值。
代码
import java.util.Scanner;
public class Test_3 {
public static void main(String[] args) {
System.out.println("请输入10个整数:");
Scanner input = new Scanner(System.in);
int[] nums = new int[10];
for(int i = 0; i < nums.length; i ++) {
nums[i] = input.nextInt();//对数组进行动态赋值
}
//假定数组下标为0 定为最值
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);
}
}
运行结果:
3、两数之和
问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为 目标值的那两个整数,并输出他们的数组下标 假设每种输入只会对应一个答案,不能重复利用这个数组中同样的元素。
示例: 给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以输出 0,1
代码
public class Test_4 {
public static void main(String[] args) {
int[] nums = {
2,11,15,7};
int target = 9;
boolean flag = false;
T: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.println("满足两数之和的下标分别是:" + i + " 和 " + j);
flag = true;
break T;// 跳出最外层循环
}
}
}
// 未找到则给出提示
if(flag == false) {
System.out.println("未找到满足目标值的两个数组中整数。");
}
}
}
运行结果:
关键技巧
- 若题目需要给出提示信息,都可以另设一个boolean变量来判断给出提示。
4、排序并查找
问题描述
对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找 6 并 输出排序后的下标。
代码
import java.util.Arrays;
public class Test_5 {
public static void main(String[] args) {
int[] nums = {
1,3,9,5,6,7,15,4,8};//对数组静态初始化
int target = 6;
System.out.println("数组nums排序前:");
for(int num : nums) {
System.out.print(num + " ");
}
System.out.println();
Arrays.sort(nums);//对输入的整数数组进行排序
System.out.println("数组nums排序后:");
for(int num : nums) {
System.out.print(num + " ");
}
System.out.println();
//采用二分查找法
int minIndex = 0;
int maxIndex = nums.length - 1;
int midIndex = 0;
//方法一:
while(true) {
midIndex = minIndex + ((maxIndex - minIndex) >>1);
if(target > nums[midIndex]) {
中间数据较大
minIndex = midIndex + 1;
}else if(target < nums[midIndex]) {
//中间数据较小
maxIndex = midIndex - 1;
}else {
//找到目标数据,数据位置:midIndex
break;
}
if(minIndex > maxIndex) {
//找不到目标数据,返回-1
midIndex = -1;
break;
}
}
//方法二:不常用for循环。
/*for( ;minIndex <= maxIndex; ) {
midIndex = minIndex + ((maxIndex - minIndex) >>1);
if(target > nums[midIndex]) {
中间数据较大
minIndex = midIndex + 1;
}else if(target < nums[midIndex]) {
//中间数据较小
maxIndex = midIndex - 1;
}else {
//找到目标数据,数据位置:midIndex
break;
}
}*/
System.out.println("查找" + target + "整数位于数组下标的" + midIndex);
}
}
运行结果:
5、移动零
问题描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保 持非零元素的相对顺序。
示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
代码
public class Test_6 {
public static void main(String[] args) {
int temp = 0;//;临时存储,第三方变量
System.out.println("请确定数组的长度值:");
Scanner input = new Scanner(System.in);
int n = input.nextInt();//数组的长度
System.out.println("请对每个数组赋值:");
int[] nums = new int[n];
for(int i = 0; i < nums.length; i ++) {
nums[i] = input.nextInt();//对数组动态初始化
}
System.out.println("数组nums遍历:");
for(int num : nums) {
//for-each遍历
System.out.print( num + " ");
}
System.out.println();
//方法一:引入第三方变量不断 双重循环 将0和后面元素进行比较。
/*for(int i = 0; i < nums.length; i ++) {
for(int j = i + 1; j <nums.length; j ++) {
// 将0移动到数组的末尾
if(nums[i] == 0 && nums[j] != 0) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
System.out.println("移动之后的数组:");
for(int num_1 : nums) {//遍历
System.out.print(num_1 + " ");
}*/
//方法二:引入新的数组 依次按顺序 来存放旧数组非零的数据。
int[] nums_2 = new int[n]; //调整后的新数组,接收非零的数据
int index = 0; // 新数组下标的索引
for(int i = 0; i <nums_2.length; i ++) {
//nums_2数组初始化为0
nums_2[i] = 0;
}
for(int i = 0; i < nums.length; i ++) {
//将nums里不为0的元素依次放入nums_2中
if(nums[i] != 0) {
nums_2[index++] = nums[i];
}
}
System.out.println("移动之后的数组:");
for(int num_2 : nums_2) {
//遍历
System.out.print(num_2 + " ");
}
}
}
运行结果: