1
解法一
import java.util.*;
class Demo{
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
*/
//1.获取用户输入的数据 动态的扩容数组填充数据
Scanner scanner = new Scanner(System.in);
int[] arr=new int[0];
System.out.print("Enter numbers:");
while(true){
int 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;
}
}
}
解法二
mport java.util.*;
class Demo{
public static void main(String[] args){
//思路2:借助计数排序的思想 将数组固定起来
//0 1 2 3 4 5~100
//0 单独不算
//arr[i]就表示数字i出现的次数
int[] arr=new int[101];
//提示用户输入
Scanner s=new Scanner(System.in);
System.out.print("Enter numbers:");
while(true){
int num=s.nextInt();
if(num==0){//如果为0退出
break;
}else //不为零时+1
arr[num]++;
}
for(int i=0;i<arr.length;i++){
if(arr[i]!=0){
//如果arr[i]>1为times 否则为time
System.out.println(i+" occurs "+arr[i]+(arr[i]>1?" times":"time"));
}
}
}
}
2
import java.util.*;
class Demo{
public static void main(String[] args){
func1();
}
public static void func1(){
//1.循环遍历数组进行赋值
Scanner scanner = new Scanner(System.in);
System.out.print("Enter 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;){
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;
}
}
public static void method1(int[] arr){
int[] newArr=new int[0];
for(int i=0;i<arr.length;i++){ //O(n)
if(!contains(newArr,arr[i])){ //O(m)
newArr=copyOf(newArr,newArr.length+1);
newArr[newArr.length-1]=arr[i];
}
}
System.out.println(Arrays.toString(newArr));
}
public static boolean contains(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[] arr,int newLen){
int[] newArr=new int[newLen];
for(int i=0;i<arr.length;i++){
newArr[i]=arr[i];
}
return newArr;
}
}
3
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
//获取用户的输入
//第一个输入的数据是数据的个数
Scanner s = new Scanner(System.in);
System.out.print("输入列表:");
int len = s.nextInt();
int[] arr= new int[len];
for(int i = 0; i < arr.length; i++){
arr[i] = s.nextInt();
}
//对数组进行有序的判断
if(isSorted(arr)){
System.out.println("The list is already sorted");
}else{
System.out.println("The list is not sorted");
}
}
public static boolean isSorted(int[] list){
//如果不是升序排列 那么势必会出现有一组数据 左大右小的情况
for(int i=1;i<list.length;i++){
if(list[i-1]>list[i]){
return false;
}
}
return true;
}
}
4
/*
输入的数据:
槽子的个数 球的个数=路径的个数
创造槽子的具体的容器int【】
每一个小球下落的路径L R 字符串
对于每一个小球而言其路径中的步骤是随机产生L R
*/
import java.util.*;
public class Demo{
public static void main(String[] args){
//1提示用户输入槽的个数和小球的个数
Scanner s=new Scanner(System.in);
System.out.print("Enter the number of balls to drop");
int balls=s.nextInt();
System.out.print("Enter the number of slots to in the bean machine:");
int slots=s.nextInt();
//2根据已有的槽子个数去创建曹子容器
int[] arr=new int[slots];
//3几个球几个路径path 根据已有的球和槽子的个数去随机创建一个小球下落的路径
for(int i=0;i<balls;i++){
String path=getPath(slots);
System.out.println(path);
//5 如何通过路径的经过得知最终所落入的槽子? 只要看当前路径中R的个数
arr[getR(path)]++;
}
//6输出
System.out.println(Arrays.toString(arr));
}
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;
}
public static String getPath(int arr){
//4根据槽子的个数计算每一个球下落的路径
Random random=new Random();
String path="";
for(int j=0;j<arr-1;j++){
if(random.nextInt(2)==0){//向左
path+="L";
}else{//向右
path+="R";
}
}
return path;
}
}
5
class Demo5{
public static void main(String[] args){
int[] list1={1,2,3,4,5,6,7};
int[] list2={1,2,3,4,5,7,6};
System.out.println(equals(list1,list2));
}
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;
}
}
6
class Demo{
public static void main(String[] args){
int[] arr={1,1,1,1,2,2,2,2,2,3,3,3,3,3,4};
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;
}
}
//当次数大于4时输出该数字
if(count>=4){
System.out.println(arr[i]);
return;
}
i+=count;
}
//但没有连续四次出现时输出没有
System.out.println("没有!");
}
}
7
import java.util.*;
public class Demo{
public static void main(String[] args){
int[] list1={1,3,5,7,9};
int[] list2={2,4,6,8,10};
System.out.println(Arrays.toString(merge(list1,list2)));
}
/*
有序数组的合并
最主要的问题在于 数组之间有长有短
*/
public static int[] merge(int[] list1,int[] list2){
//两个都为空时返回null
if(list1==null&&list2==null){
return null;
}
//其中一个为空时返回另一个数组
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//只有两个都不是null的情况再考虑具体操作
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){
break;
}
if(p1<list1.length&&p2==list2.length){
list3[p3++]=list1[p1++];
}else if(p1==list1.length&&p2<list2.length){
list3[p3++]=list2[p2++];
}else{
if(list1[p1]<=list2[p2]){
list3[p3++]=list1[p1++];
}else{
list3[p3++]=list2[p2++];
}
}
}
return list3;
}
}
8
import java.util.*;
public class Demo8{
/*
数据 一组单词的明文 单词的密文 单词的状态
program
1000000 r r
pr**r**
*/
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
Random random=new Random();
//1.创建一个单词表
String[] words={"naruto","kakashi","sasuke","banana","java","program"};
//10.最后再去做多单词猜测
while(true){
//2.随机从单词表中抽取一个单词
String word=words[random.nextInt(words.length)];
//3.创建一个该单词的状态表 默认值是false(密文)
boolean[] status=new boolean[word.length()];
int miss=0; //猜错的个数
//4.开始猜一个单词
while(true){
//5.根据单词和状态表 决定密文形式
String ciphertext=getCipherText(word,status);
//6.输出密文并提示用户输入字母
System.out.print("Enter a letter in word "+ciphertext+" >");
char letter=scanner.nextLine().charAt(0);//"p".charAt(0)
//7.判断单词中是否有该字母
if(isContainsLetter(word,letter)){
//8.改变单词状态表 已修改/未修改
//true 表示从未修改 第一次来的
//false 表示已修改 不是第一次来 提示已经存在
if(!changeWordStatus(word,status,letter)){
System.out.println("\t "+letter+" is already in the word");
}
}else{
System.out.println("\t "+letter+" is not in the word");
miss++;
}
//9.是否结束
if(isFinish(status)){
System.out.println("The word is "+word+". You miss "+miss+" time");
break;
}
}
System.out.print("Do you want to guess another word?Enter y or n:");
String choice=scanner.nextLine();
if(choice.equals("n")){
System.out.println("Welcome!Thank you! FUCK PROGRAM!");
break;
}
}
}
public static boolean isFinish(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(word.charAt(i)==letter){
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;
}
}
9
import java.util.*;
class Demo{
public static void main(String[] args){
/*
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
累加行的时候 行不动 列动
累加列的时候 列不动 行动
*/
//1.输入一个3*4的矩阵
Scanner scanner=new Scanner(System.in);
System.out.println("Enter numbers:");
double[][] matrix=new double[3][4];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
matrix[i][j]=scanner.nextDouble();
}
}
//2.打印每列的和
for(int col=0;col<matrix[0].length;col++){
System.out.println(sumColumn(matrix,col));
}
}
public static double sumColumn(double[][] m,int col){
double sum=0;
for(int row=0;row<m.length;row++){
sum+=m[row][col];
}
return sum;
}
}
10
class Demo{
public static void main(String[] args){
/*
(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
主对角线上的元素 行列角标是相等的
*/
int[][] m={
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10,11,12},
{13,14,15,16}
};
//主对角线
int sum=0;
for(int i=0;i<m.length;i++){
sum+=m[i][i];
}
System.out.println(sum);
//副对角线
int subsum=0;
for(int i=0;i<m.length;i++){
subsum+=m[i][m.length-1-i];
}
System.out.println(subsum);
}
}
11
class Demo {
public static void main(String[] args){
//m*n n*p m*p 矩阵相乘 前者的列 必须等于 后者的行
/*
1 2 3 1 2 1*1+2*3+3*5 1*2+2*4+3*6
× 3 4 =
4 5 6 5 6 4*1+5*3+6*5 4*2+5*4+6*6
对于数学上的一些运算公式 如果直接通过看计算流程还是比较麻烦的
此时推荐使用已知公式计算!
*/
double[][] A={ //m*p
{1,2,3},
{4,5,6},
{7,8,9}
};
double[][] B={ //p*n
{0,2.0,4.0},
{1,4.5,2.2},
{1.1,4.3,5.2}
};
double[][] C=new double[A.length][B[0].length];//m*n
for(int i=0;i<C.length;i++){
for(int j=0;j<C[i].length;j++){
double sum=0;
for(int k=0;k<B.length;k++){
sum+=A[i][k]*B[k][j];
}
C[i][j]=sum;
System.out.print(C[i][j]+" ");
}
System.out.println();
}
}
}
12
import java.util.*;
class Demo {
public static void main(String[] args){
//1.输入方针的尺寸 创建方阵
Scanner scanner=new Scanner(System.in);
System.out.print("Enter size:");
int size=scanner.nextInt();
int[][] m=new int[size][size];
//2.随机的给方阵中填入0或1
Random random=new Random();
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
m[i][j]=random.nextInt(2);
System.out.print(m[i][j]+" ");
}
System.out.println();
}
//3.让行,列,对角线累加 sum==0 sum==size 表示全相等
checkRow(m);
checkCol(m);
checkDiagonal(m);
checkSubDiagonal(m);
}
public static void checkSubDiagonal(int[][] m){
int sum=0;
for(int i=0;i<m.length;i++){
sum+=m[i][m.length-1-i];
}
if(sum==m.length||sum==0){
System.out.printf("副主对角线全相等且是%d\n",sum==0?0:1);
}
}
public static void checkDiagonal(int[][] m){
int sum=0;
for(int i=0;i<m.length;i++){
sum+=m[i][i];
}
if(sum==m.length||sum==0){
System.out.printf("主对角线全相等且是%d\n",sum==0?0:1);
}
}
public static void checkRow(int[][] m){
for(int i=0;i<m.length;i++){
int sum=0;
for(int j=0;j<m[i].length;j++){
sum+=m[i][j];
}
if(sum==m.length||sum==0){
System.out.printf("第%d行全相等且是%d\n",i+1,sum==0?0:1);
}
}
}
public static void checkCol(int[][] m){
for(int j=0;j<m.length;j++){
int sum=0;
for(int i=0;i<m.length;i++){
sum+=m[i][j];
}
if(sum==m.length||sum==0){
System.out.printf("第%d列全相等且是%d\n",j+1,sum==0?0:1);
}
}
}
13
import java.util.*;
class Demo0{
public static void main(String[] args){
//输入行列
Scanner scanner=new Scanner(System.in);
System.out.print("Enter row ,col:");
int row=scanner.nextInt();
int col=scanner.nextInt();
int[][] m=new int[row][col];
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
m[i][j]=scanner.nextInt();
}
}
System.out.println(isConsecutiveFour(m));
}
public static boolean isConsecutiveFour(int[][] m){
for(int i=0;i<m.length;i++){
for(int j=0;j<m[i].length;j++){
//向右
if(j<=m[i].length-4){
boolean flag=true;
for(int c=j+1;c<=j+3;c++){
if(m[i][j]!=m[i][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向下
if(i<=m.length-4){
boolean flag=true;
for(int r=i+1;r<=i+3;r++){
if(m[i][j]!=m[r][j]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向右下
if(i<=m.length-4&&j<=m[0].length-4){
boolean flag=true;
for(int r=i+1,c=j+1;r<=i+3;r++,c++){
if(m[i][j]!=m[r][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向右上
if(i>=3&&j<=m[0].length-4){
boolean flag=true;
for(int r=i-1,c=j+1;c<=j+3;r--,c++){
if(m[i][j]!=m[r][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
}
}
return false;//四个方向都没有连续的
}
}
14
import java.util.*;
public class Demo {
public static void main(String[] args) {
//提示用户输入
System.out.print("Enter number n:");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
System.out.println("Enter "+n+" rows of letters separated by spaces:");
char[][] matrix = new char[n][n]; //二维数组 char型
String temp = null;
for(int i = 0; i < n; i++){
for(int j = 0; j < n;j++){
temp = input.next();
matrix[i][j] = temp.charAt(0); //将字符串转换成数组
if(matrix[i][j]>('A'+n-1)) System.out.println("Wrong input: the letters separated must be from A to "+((char)('A'+n-1)));
}
}
int[] record = new int[n];
Arrays.fill(record, 0); //将0填充到record中
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
++record[(int)(matrix[i][j]-'A')];
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
++record[(int)(matrix[j][i] - 'A')];
}
}
boolean flag = true;
for(int i = 0; i < n; i++){
if(record[i] != 2*n){
flag = false;
}
}
if(flag==true)
System.out.println("The input array is a Latin square");
else System.out.println("The input array is not a Latin square");
}
}