第五章题总结
程序员文章站
2024-03-02 12:35:34
...
5.1
answer1: 利用数据扩容来做哦
import java.util.*;
class test511{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
//定义一个空数组
int [] arr=new int[0];
//用户请输入数据
System.out.print("用户请输入数据 ");
//将数据放到扩容后的新数组中
while(true){
int num=scanner.nextInt();
if(num==0){
break;
}
//验证用户输入数据的正确性
if(num<1||num>100){
System.out.print("数据非法 ");
return;
}
arr=copyOf(arr,arr.length+1);
arr[arr.length-1]=num;
}
//按照输出结果,将数据中的数据进行排序
insertSort(arr);
//输出连续相等的数字
show(insertSort(arr));
}
public static int [] copyOf(int [] arr,int len){
int [] newArr=new int [len];
for(int i=0;i<arr.length;i++){
newArr[i]=arr[i];
}
return newArr;
}
public static int [] 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;
}
return arr;
}
public static void show(int [] arr){
// System.out.print(Arrays.toString(arr));
for(int i=0;i<arr.length;){
int count=1;
for(int j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
count++;
}
else{
break;
}
}
System.out.println(arr[i]+"occurs"+count+ (count>1?"times":"time"));
i+=count;
}
}
}
answer2:利用计数原理做哦
import java.util.*;
class test511_02{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
//定义一个空数组
int [] arr=new int[101];
//用户请输入数据
System.out.print("用户请输入数据 ");
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"));
}
}
}
}
5.2
这道题有三种解法
anwer1:新建一个数组来做,不过这样做比较占用空间
import java.util.*;
class test52_01{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
//循环遍历数组并且进行赋值
int [] arr=new int[10];//空间是S(n) 时间是O(n^2)
System.out.print("请输入数据 ");
int num;
for(int i=0;i<arr.length;i++){
num=scanner.nextInt();
arr[i]=num;
}
//创建一个新数组,如果这个新数组和arr数组进行比较,如果newArr
//不包含arr中的数据,然后将arr数据放到newArr中
System.out.print(method(arr));
}
public static int [] method(int [] arr){
int [] newArr=new int [0];
for(int i=0;i<arr.length;i++){
if(!isContains(newArr,arr[i])){
newArr=copyOf(newArr);
newArr[newArr.length-1]=arr[i];
}
}
return newArr;
}
public static boolean isContains(int [] arr,int key){
for(int i=0;i<arr.length;i++){
if(arr[i]==key){
return true;
}
}
return false;
}
public static int [] copyOf(int [] newArr){
int [] newArr1=new int [newArr.length+1];
for(int i=0;i<newArr.length;i++){
newArr1[i]=newArr[i];
}
return newArr1;
}
}
answer2:利用数组数据连续相等的原理来做
/*
利用数据连续相等的原理
*/
import java.util.*;
class test52_02{
public static void main(String [] args){
System.out.print("请输入数据 ");
Scanner scanner =new Scanner(System.in);
//创建一个数据 空间是S(1)
int [] arr=new int [10];
for(int i=0;i<arr.length;i++){
arr[i]=scanner.nextInt();
}
// System.out.print(Arrays.toString(arr));
method(arr);
}
public static void method(int [] arr){
//利用连续相等的原理
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]);
int count=1;
for(int j=i+1;j<arr.length;j++){
if(arr[j]==arr[i]){
count++;
}
else{
break;
}
}
i+=count;
}
}
}
answer3:这种解法就是当发现有相等的数,就把后面的数往前移,相当于覆盖
import java.util.*;
class test52_03{
public static void main(String[] args){
//如果两数不相等,就将后面的数字往前移
Scanner scanner=new Scanner(System.in);
System.out.print("请输入十个数字 ");
int [] arr =new int[10];
for(int i=0;i<arr.length;i++){
arr[i]=scanner.nextInt();
}
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;j++){
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]+" ");
}
}
}
5.3遍历数组,通过比较数组中个的每个元素来判断元素是否排好序
import java.util.*;
class test53{
public static void main(String[] args){
//获取数组的长度并对数组进行遍历
Scanner scanner =new Scanner(System.in);
System.out.print("输入数组的长度 ");
int len =scanner.nextInt();
//新建数组
int [] arr=new int[len];
//遍历数组并且赋值
System.out.print("输入数组的数据 ");
for(int i=0;i<arr.length;i++){
arr[i]=scanner.nextInt();
}
//对数组进行有序的判断
if(isSort(arr)){
System.out.print("数组已经排好序了 ");
}
else{
System.out.print("数组没有排好序 ");
}
}
public static boolean isSort(int [] list){
for(int i=1;i<list.length;i++){
if(list[i-1]!=list[i]){
return false;
}
}
return true;
}
}
5.4数组在现实中的应用
看代码哦
/*
输入数据:球的个数=路径的个数 槽子的个数
创建槽子个数的容器int [] arr
对于每一个小球的下落的路径是字符L或者R
对于每一个小球而言其路径中的步骤是随机产生R和L
1,提示用户输入球的个数和槽子的个数
2,根据已有的槽子的个数区创建槽子容器
3,根据已有的球的个数和槽子的个数区随机创建一个小球下落的路径
4,路径中经过几个钉子?路径的步骤有几步和槽子的个数有关
5,如何通过路径的经过得知最终落入的槽子?
*/
import java.util.*;
class test54{
public static void main(String [] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the number of balls to drop ");
int balls=scanner.nextInt();
System.out.print("Enter the number of slots in the bean machine ");
int slots=scanner.nextInt();
//创建槽子个数的容器int [] arr
int [] arr=new int[slots];
//每一个球对应一种路径
for(int i=0;i<balls;i++){
String path=getPath(slots);
//打印这些球的路径
System.out.println(path);
//打印槽子底部球落入的个数 主要是看R的个数
//一个R代表1号槽,同理其他一样
arr[getR(path)]++;
}
//输出arr槽子的情况
System.out.println(Arrays.toString(arr));
show(arr);
}
public static void show(int [] arr){
int w=arr.length;
int h=0;
for(int i=0;i<arr.length;i++){
//求出高的最大值
if(h<arr[i]){
h=arr[i];
}
}
for(int i=h-1;i>=0;i--){
for(int j=0;j<w;j++){
if(i<arr[j]){
System.out.print("O");
}
else{
System.out.print(" ");
}
}
System.out.println();
}
}
public static String getPath(int slots){
Random random =new Random();
String path=" ";
//根据槽子的个数计算每个数下落的路径
//对于每一个小球而言,碰到每一个钉子都有两种路径R和L
//钉子的个数是slots-1
for(int j=0;j<slots-1;j++){
//产生一个随机路径R或者L
if(random.nextInt(2)==0){
path+="L";//向左
}
else {
path+="R";//向右
}
}
return path;
}
public static int getR(String path){
int count=0;
for(int i=0;i<path.length();i++){
if(path.charAt(i)=='R'){
count++;
}
}
return count;
}
}
5.5
先判断长度是否相等,再判断两个数组中的元素是否相等
/*
判断两个数组是否相等
*/
import java.util.*;
class test55{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
System.out.print("输入list1的个数 ");
int len1=scanner.nextInt();
int [] list1=new int [len1];
System.out.print("输入list1的数据 ");
for(int i=0;i<list1.length;i++){
list1[i]=scanner.nextInt();
}
System.out.print("输入list2的个数 ");
int len2=scanner.nextInt();
int [] list2=new int [len1];
System.out.print("输入list2的数据 ");
for(int i=0;i<list2.length;i++){
list1[i]=scanner.nextInt();
}
}
public static boolean equals(int [] list1,int [] list2){
//判断数组长度是否相等
if(list1.length!=list2.length){
return false;
}
//在判断元素的大小
for(int i=0;i<list1.length;i++){
if(list1[i]!=list2[i]){
return false;
}
}
return true;
}
}
5.6利用数组相等原理做的,看代码~!
import java.util.*;
class test56{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
System.out.print("输入arr的个数 ");
int len=scanner.nextInt();
int [] arr=new int [len];
System.out.print("输入arr的数据 ");
for(int i=0;i<arr.length;i++){
arr[i]=scanner.nextInt();
}
}
public static void method(int [] arr){
for(int i=0;i<arr.length;i++){
int count=1;
for(int j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
count++;
}
else{
break;
}
}
if(count>=4){
System.out.print(arr[i]);
break;
}
i+=count;
}
System.out.print("没有 !");
}
}
5.7先判断两个是否为空
不为空的话,两数组进行比较,把较小的元素,一次放到第三个数组中
import java.util.*;
class test57{
public static void main(String [] args){
Scanner scanner =new Scanner(System.in);
System.out.print("输入list1的个数 ");
int len1=scanner.nextInt();
int [] list1=new int [len1];
System.out.print("输入list1的数据 ");
for(int i=0;i<list1.length;i++){
list1[i]=scanner.nextInt();
}
System.out.print("输入list2的个数 ");
int len2=scanner.nextInt();
int [] list2=new int [len2];
System.out.print("输入list1的数据 ");
for(int i=0;i<list2.length;i++){
list2[i]=scanner.nextInt();
}
System.out.print(Arrays.toString( merge(list1, list2)));
}
public static int[] merge(int [] list1,int [] list2){
if(list1==null&&list2==null){
return null;
}
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//如果两者都不为空
int[] list3=new int[list1.length+list2.length];
int p1=0;
int p2=0;
int p3=0;
while(true){
if(p1==list1.length&&p2==list2.length){ //说明p1和p2都已经走完了
break;
}
if(p1==list1.length&&p2<list2.length){
list3[p3++]=list2[p2++];
}
else if(p1<list1.length&&p2==list2.length){
list3[p3++]=list1[p1++];
}
else{
if(list1[p1]<list2[p2]){
list3[p3++]=list1[p1++];
}
else{
list3[p3++]=list1[p2++];
}
}
}
return list3;
}
}
5.8
数组在现实中的应用
/*
数据 一组单词的明文 一组单词的密文 单词的状态
******
p***** 输入p时显示p
*/
import java.util.*;
class test58{
public static void main(String[] args){
Scanner scanner =new Scanner(System.in);
Random random=new Random();
//1创建一个单词表
String [] words={"rerer","sttfdg","java","gddfg","program"};
//2随机从单词表中抽取一个单词
while(true){
String word=words[random.nextInt(words.length)];
//3创建一个该单词默认值(false)密文
boolean [] status=new boolean[word.length()];
int miss=0;//猜错的个数
while(true){
//4开始第一个单词
//5根据单词和密文表,决定密文的形式
String ciphertext=getCipherText(word,status);
//6输出密文并提示用户输入字母
System.out.print("Enter a letter in word"+ciphertext+">");
char letter =scanner.nextLine().charAt(0);
//判断单词中是否有字母
if(isContainsLetter(word,letter)){
//单词有的话是分两种情况,已经修改和未修改
if(!changeWordStatus(word, status, letter)){
//如果为true说明是已经修改了
//如果是false说明没有修改
System.out.print(letter+"is already in word ");
}
}
else {
System.out.print(letter+"is not in word ");
miss++;
}
//是否结束
if(isFinished(status)){
System.out.print("The word is"+word +"you miss"+miss+"times");
break;
}
}
System.out.print("Do you want to guess annother word?Enter n or y");
String choice =scanner.nextLine();
if(choice.equals("n")){
System.out.print("welcome!Thank you ");
break;
}
}
}
public static boolean isFinished(boolean[] status){
for(int i=0;i<status.length;i++){
if(!status[i]){
return false;
}
}
return true;
}
public static boolean changeWordStatus(String word,boolean[] status,char letter){
for(int i=0;i<word.length();i++){
if(letter==word.charAt(i)){
if(status[i]){ //表示已经修改了
return false;
}
else{
status[i]=true;
}
}
}
return true;
}
public static boolean isContainsLetter(String word,char letter){
for(int i=0;i<word.length();i++){
if(word.charAt(i)==letter){
return true;
}
}
return false;
}
public static String getCipherText(String word,boolean[] status){
String ciphertext=" ";
for(int i=0;i<status.length;i++){
if(status[i]){
ciphertext+=word.charAt(i);
}
else{
ciphertext+="*";
}
}
return ciphertext;
}
}
未完待续!!!!!!!
上一篇: JAVA随机打乱数组顺序的方法
下一篇: ragout 基因组拼接