学了关于数组的知识点,这次我们一起来看一些关于数组的编程题!
思路分析:这道题有两种思路,所以提供两种解法。思路一就是func1(),思路二是func2()。
思路一:题目当中读取的整数的个数不确定,即数组的长度不固定,所以我们需要每读取一个数据,然后进行数组扩容,再填入数据,数据填入之后再进行排序,最后遍历数组依次判断数据的个数。
第一步:获取用户输入的数据,动态的扩容数组填充数据;
第二步:按照输出结果,将数据中的数据进行排序;
第三步:输出连续相等的数字;
第四步:编写代码。
思路二:借助计数排序的思想,将数组固定起来,然后进行操作。具体来看代码:
import java.util.*;
class Demo05_01{
public static void main(String[] args){
/*
思路1:数组长度不固定,需要读取一个数据,数组扩容,填入数据
数据填入之后进行排序,然后遍历数组依次判断数据的个数
连续相等
2 2 2 2 3 3 4 4 4 4 5 5 6 6 6 6 7 7
思路2:借助计数排序的思想,将数组固定起来。
*/
//func1();
func2();
}
public static void func2(){
//arr[i] 就表示数字i出现的次数
int[] arr = new int[101];
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the integers between 1 and 100:");
while(true){
int num = scanner.nextInt();
if(num == 0){
break;
}
arr[num]++;
}
for(int i = 0;i < arr.length;i++){
if(arr[i] != 0){
System.out.println(i + " occurs " + arr[i] + (arr[i] > 1?" times":" time"));
}
}
}
public static void func1(){
//1.获取用户输入的数据 动态的扩容数组填充数据
int[] arr = new int[0];
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the integers between 1 and 100:");
int num = 0;
while(true){
num = scanner.nextInt();
if(num == 0){
break;
}
//验证用户输入数据的正确性
if(num < 1 || num > 100){
System.out.println("有非法数据!");
return;
}
arr = copyOf(arr,arr.length + 1);
arr[arr.length - 1] = num;
}
//2.按照输出结果,将数据中的数据进行排序
insertSort(arr);
//3.输出连续相等的数字
show(arr);
}
public static int[] copyOf(int[] arr,int newLen){
int[] newArr = new int[newLen];
for(int i = 0;i < arr.length;i++){
newArr[i] = arr[i];
}
return newArr;
}
public static void insertSort(int[] arr){
for(int i = 1;i < arr.length;i++){
int e = arr[i];
int j;
for(j = i;j > 0 && arr[j - 1] > e;j--){
arr[j] = arr[j - 1];
}
arr[j] = e;
}
}
/*
Arrays Math都是属于工具类
Arrays 特殊的是数组的工具类
toString(arr) 就是将数据的每个元素进行拼接 并返回拼接后的字符串数据
"[1,2,3,4]"
*/
public static void show(int[] arr){
//System.out.println(Arrays.toString(arr));
//此时就将问题转成了如何判断连续相等的数据分别出现多少次
//[1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6]
for(int i = 0;i < arr.length;){
int count = 1;
for(int j = i + 1;j < arr.length;j++){
if(arr[j] == arr[i]){
count++;
}else{
break;
}
}
System.out.println(arr[i] + " occurs " + count + (count>1?" times":" time"));
i+=count;
}
}
}
运行结果:
Enter the integers between 1 and 100:2 5 6 5 4 3 23 43 2 0
2 occurs 2 times
3 occurs 1 time
4 occurs 1 time
5 occurs 2 times
6 occurs 1 time
23 occurs 1 time
43 occurs 1 time
思路分析:这道题也有两个思路,所以提供两种解法。思路一就是func1(),思路二是func2()。
思路一:在10个数全部输入之后再去重复;
第一步:循环遍历数组进行赋值;
第二步:开始对已有的数据进行去重复操作,这一步又提供了三种方法,method1、method2、method3;
第三步:编写代码。
思路二:边输入边去重复。具体来看代码:
import java.util.*;
class Demo05_02{
public static void main(String[] args){
/*
思路1
在全部输入之后去重复 func1
思路2
边输入边去重复 func2
*/
//func1();
func2();
}
public static void func2(){
int[] arr = new int[0];
Scanner scanner = new Scanner(System.in);
System.out.print("Enter ten numbers:");
for(int i = 0;i < 10;i++){
int num = scanner.nextInt();
if(!contains(arr,num)){
arr = copyOf(arr,arr.length + 1);
arr[arr.length-1] = num;
}
}
System.out.println("The number of distinct number is: " + arr.length);
System.out.println("The distinct numbers are: " + Arrays.toString(arr));
}
public static void func1(){
//1.循环遍历数组进行赋值
Scanner scanner = new Scanner(System.in);
System.out.print("Enter ten numbers:");
int[] arr = new int[10];
for(int i = 0;i < arr.length;i++){
arr[i] = scanner.nextInt();
}
//2.开始对已有的数据进行去重复操作
// 1 2 3 3 2 4 3 2 4 1
// 1 2 3 4
// method1(arr); //空间S(n) 时间O(nm)
// method2(arr); //空间S(1) 时间O(n^2)
// method3(arr);
}
public static void method3(int[] arr){
//不创建额外空间 不许改变原先的顺序
int i = 0;
int size = arr.length;
while(i < size){
for(int j = i + 1;j < size;){
if(arr[j] == arr[i]){
for(int k = j + 1;k < size;k++){
arr[k - 1] = arr[k];
}
size--;
}else{
j++;
}
}
i++;
}
for(i = 0;i < size;i++){
System.out.print(arr[i] + " ");
}
}
public static void method2(int[] arr){
//插入排序
for(int i = 1;i < arr.length;i++){
int e = arr[i];
int j;
for(j = i;j > 0 && arr[j - 1] > e;j--){
arr[j] = arr[j - 1];
}
arr[j] = e;
}
//连续相等
for(int i = 0;i < arr.length;){ //O(n)
System.out.print(arr[i] + " ");
int count = 1;
for(int j = i + 1;j < arr.length;j++){
if(arr[j] == arr[i]){
count++;