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);
}
}
}