Java基础记忆08(思维扩展01)

1: 

 /*
    思路一、 1:输入number,当number为0时,停止输入
                    2:每输入一个number,判断是否存在数组nums中,不存在数组nums扩容1,number
                         加进去,同时,counts数组扩容1,次数1加进去。
                         若number存在,运用查找数组获取角标index,然后counts[index]++
                    3: 将nums数组进行排序,同时counts数组对应位置也进行移动
*/

import java.util.Scanner;
class Class29{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入数字:");
        int[] nums=new int[0];  //定义输入数字的数组的初值
        int[] counts=new int[0];//定义数字次数的数组的初值
        while(true){            //开启循环
            int number=scanner.nextInt();//开始输入数字
            if(number==0){      //输入数字等于0时结束
                break;          //跳出当前
            }
            int index=indexfind(nums,number);//获取角标           
            if(index==-1){      //输入数字不存在数组已有中,返回值为-1
                nums=nums(nums,number);//扩容nums数组
                counts=counts(counts,number);//扩容counts数组
            }
            else{               //输入数字存在数组已有中,返回值为角标
                counts[index]++;//counts数组对应角标值+1
            }
        }
        sort(nums,counts);      //进行数组值大小排序
        for(int i=0;i<nums.length;i++){
            System.out.println(nums[i]+" occurs "+counts[i]+(counts[i]>1?" times":" time"));
        }
    }
    public static void sort(int[] nums,int[] counts){//插入排序
        for(int i=1;i<nums.length;i++){
            for(int j=i;j>0;j--){
                if(nums[j-1]>nums[j]){
                    int temp=nums[j-1];
                    nums[j-1]=nums[j];
                    nums[j]=temp;
                    int temp1=counts[j-1];
                    counts[j-1]=counts[j];
                    counts[j]=temp1;
                }
            }
        }
    }
    public static int[] nums(int[] nums,int number){//扩容nums数组
        int[] arr=new int[nums.length+1];//创建新数组arr
        for(int i=0;i<nums.length;i++){
            arr[i]=nums[i];//nums数组原有值赋给新数组arr
        }
        arr[arr.length-1]=number;//新数字赋给新数组最后一项
        return arr;//将arr的值返回
    }
    public static int[] counts(int[] counts,int number){//扩容counts数组
        int[] arr=new int[counts.length+1];
        for(int i=0;i<counts.length;i++){
            arr[i]=counts[i];//counts数组原有值赋给新数组arr
        }
        arr[arr.length-1]=1;//将新数字出现的第一次赋给新数组最后一项
        return arr;
    }
    public static int indexfind(int[] nums,int number){//获取角标
        int index=-1;      //定义角标初值
        for(int i=0;i<nums.length;i++){
            if(number==nums[i]){     //判断输入数字是否存在数组中
                index=i;             //存在则对应i赋给index
                break;               //跳出当前
            }
        }
        return index;                //将index的值返回
    }
}

 

c:\Users\Administrator\Desktop\javase02>javac Class29.java
C:\Users\Administrator\Desktop\javase02>java Class29

请输入数字: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

/*

思路二、1:定义一个数组,将所有输入进去的数字全部放入数组

              2:对数组进行排序,然后从角标0开始逐一与后边数对比,遍历

                    相同时次数count初值1++,(角标+count)再次开始往后对比

*/

import java.util.Scanner;
class Class29{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入数字:");
        int[] nums=new int[0];  //定义输入数字的数组的初值
        while(true){            //开启循环
            int number=scanner.nextInt();//输入number
            if(number==0){      //判断number等于0否
                break;          //跳出循环
            }
            else{
                nums=addnums(nums,number);//将所有输入的数字number扩容进nums
            }
        }
        sort(nums);   //进行大小排序    
        for(int i=0;i<nums.length;){
            int count=1;            //次数1初值
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]!=nums[j]){//判断是否有相同输入数字
                    break;
                }
                else{
                    count++;//记录相同数字出现的次数
                }
            }           
            System.out.println(nums[i]+" occurs "+count+(count>1?" times":" time"));
            i=i+count;//越过记录的相同数字,开启下一次对比
        }
    }
    public static void sort(int[] nums){//选择排序
        for(int i=0;i<nums.length-1;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]>nums[j]){
                    int temp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                }
            }
        }
    }
    public static int[] addnums(int[] nums,int number){//扩容
        int[] arr=new int[nums.length+1];//定义new数字arr为了将输入数字number放进去
        for(int i=0;i<nums.length;i++){
            arr[i]=nums[i];//将原有数字放入新数组arr
        }
        arr[arr.length-1]=number;//将数字赋给新数组最后一项
        return arr;              //返回arr
    }
}
c:\Users\Administrator\Desktop\javase02>javac Class29.java
C:\Users\Administrator\Desktop\javase02>java Class29

请输入数字:4 3 2 5 2 8 3 2 1 2 3 4 0
1 oocurs 1 time
2 occurs 4 times
3 occurs 3 times
4 occurs 2 times
5 occurs 1 time
8 occurs 1 time

/*

思路三、1:将输入的数当成数组的的角标,然后角标对应的值++;

                    空间换时间!

*/

import java.util.Scanner;
class Class29{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入数字:");
        int[] nums=new int[101];//定义一个长为101的数组nums
        while(true){            //开始循环
            int number=scanner.nextInt();//输入数字
            if(number==0){               //判断是否等于0
                break;                   //跳出循环
            }
            else{
                nums[number]++;          //数字等于角标,对应值加1
            }
        }
        for(int i=1;i<101;i++){          //输出
            if(nums[i]!=0){
                System.out.println(i+" occurs "+nums[i]+(nums[i]>1?" times":" time"));
            }
        }
    }
}

 

c:\Users\Administrator\Desktop\javase02>javac Class29.java
C:\Users\Administrator\Desktop\javase02>java Class29

请输入数字:4 3 2 5 2 8 3 2 1 2 3 4 0
1 oocurs 1 time
2 occurs 4 times
3 occurs 3 times
4 occurs 2 times
5 occurs 1 time
8 occurs 1 time

2: 

 

/*

思路一、1:定义一个长为0的数组,开始输入数字

               2:如果这个数字存在数组中,则不做操作,反之扩容加进去

               3:输出数组

*/

import java.util.Scanner;
class Class30{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);//构建输入数字的函数
        int[] nums=new int[0];  //定义一个长度为0的数组
        System.out.print("请输入10个整数:");//提示输入10个数字
        for(int i=0;i<10;i++){              //设置循环输入数字
            int number=scanner.nextInt();   //输入数字
            if(isNumberinNums(nums,number)){//判断输入数字是否存在数字
                nums=addnums(nums,number);  //不存在则扩容加入数字
            }
        }
        for(int i=0;i<nums.length;i++){     //循环打印数字
            System.out.print(nums[i]+" ");  //输出数字
        }
    }
    public static int[] addnums(int[] nums,int number){//扩容数字
        int[] arr=new int[nums.length+1];              //创建一个长度大于原数组的数组
        for(int i=0;i<nums.length;i++){                //循环将原数组值赋给新数组
            arr[i]=nums[i];                            //赋值
        }
        arr[arr.length-1]=number;                      //扩容加上新数字
        return arr;                                    //将arr返回
    }
    public static boolean isNumberinNums(int[] nums,int number){//判断输入数字是否存在数组中
        boolean flag=true;                            //初值为true
        for(int i=0;i<nums.length;i++){
            if(nums[i]==number){                      //如果输入数字存在数组
                flag=false;                           //令初值变为false
            }
        }
        return flag;                                  //不存在则返回true
    }
}

 

 

 

c:\Users\Administrator\Desktop\javase02>javac Class30.java
C:\Users\Administrator\Desktop\javase02>java Class30
请输入10个数字:1 2 3 2 1 6 3 4 5 2
1 2 3 6 4 5 

 /*

思路二、和思路一相同想法不同编程

*/

import java.util.Scanner;
class Class30{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter ten number:");
        int[] arr=new int[10];  //有效个数
        int size=0;             //定义角标的初值
        for(int i=0;i<10;i++){
            int number=scanner.nextInt();
            if(!isNumberInArray(arr,number,size)){
//如果返回false,非后,则说明输入数字不存在原数组
                arr[size]=number; //对角标的结果赋值
                size++;           //开始第二个角标
            }
        }
        for(int i=0;i<size;i++){
            System.out.print(arr[i]+" ");//输出结果
        }
    }
    public static boolean isNumberInArray(int[] arr,int number,int size){
//判断数字是否存在,size的意义是原数组的长度
        for(int i=0;i<size;i++){
            if(arr[i]==number){//判断是否存在
                return true;
            }
        }
        return false;
    }
}

 

c:\Users\Administrator\Desktop\javase02>javac Class30.java
C:\Users\Administrator\Desktop\javase02>java Class30
请输入10个数字:1 2 3 2 1 6 3 4 5 2
1 2 3 6 4 5 

 

/*

思路三、1:将输入的数字全部放进数组中

              2:进行排序,然后比较消除,定义一个次数变量count

*/

import java.util.Scanner;
class Class30{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);//构建输入函数
        System.out.print("请输入10个数字:");
        int[] nums=new int[10];                //创建一个长为10的数组
        for(int i=0;i<10;i++){                 //输入10个数字
            int number=scanner.nextInt();      //输入数字
            nums[i]=number;                    //将输入的数字放入数组nums
        }
        nums=sort(nums);                       //对数组进行排序
        for(int i=0;i<10;){                    //这一块和class29思路二类似
            int count=1;                      
            for(int j=i+1;j<10;j++){
                if(nums[i]==nums[j]){
                    count++;
                }
                else{
                    break;
                }
            }
            System.out.print(nums[i]+" ");
            i=i+count;
        }
    }
    public static int[] sort(int[] nums){     //选择排序
        for(int i=0;i<nums.length-1;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]>nums[j]){          //大小互换
                    int temp=nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        return nums;                         //排序后的结果返回
    }
}

 

c:\Users\Administrator\Desktop\javase02>javac Class30.java
C:\Users\Administrator\Desktop\javase02>java Class30
请输入10个数字:1 2 3 2 1 6 3 4 5 2
1 2 3 4 5 6 

3:汉诺塔思维编程。

      3个载子,x,y,z。 

     从第一个载子x移动最底的盘子到第三个载子z,需要借助第二个载子y。

     从第二个载子y移动最底的盘子到第三个载子z,需要借助第一个载子x。

import java.util.Scanner;
class Hano{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        System.out.print("请输入所要移动盘子的个数:");
        int level=scanner.nextInt();//输入盘子的个数
        move("x","y","z",level);
    }
    public static void move(String from,String mid,String to,int level){
        if(level==1){        //判断是否是需移动一个盘子
            System.out.println(from+"->"+to);//输出路径
        }
        else{
            move(from,to,mid,level-1);
            System.out.println(from+"->"+to);
            move(mid,from,to,level-1);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值