04 数组习题的整理

1.数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”,不包含就打印出“No”。

import java.util.Scanner;

public class Test4 {
    public static void main(String[] args) {

        String [] name =new String[10];
        for(int i=0;i< name.length;i++){
            System.out.println("请输入一个单词");
        Scanner input = new Scanner(System.in);
        name[i]=input.next();
            System.out.println("第"+(i+1)+"个单词为"+name[i]);
        }


     //   String []name={"ssd","ffs","ssss"};
        System.out.println("请输入一个单词");
        Scanner input = new Scanner(System.in);
        String danci = input.next();
        for(int j=0;j<name.length;j++){
            if(danci.equals(name[j])){
                System.out.println("YES");
            }
        }
        System.out.println("NO");
    }
}

输出结果

上面代码不对;跑出来YES但是后面还会有NO
如下所示

请输入一个单词
11个单词为1
请输入一个单词
22个单词为2
请输入一个单词
33个单词为3
请输入一个单词
44个单词为4
请输入一个单词
55个单词为5
请输入一个单词
66个单词为6
请输入一个单词
77个单词为7
请输入一个单词
88个单词为8
请输入一个单词
99个单词为9
请输入一个单词
1010个单词为10
请输入一个单词
5
YES
NO

Process finished with exit code 0

刚才我又拿去跑了一遍发现是错的;经过查找发现BUG存在于最后的YES于NO的判断
遍历比较完后不能直接输出;否则会出现上面是对的但是跳出来了还要输出依次NO
所以我在这里加上了计数器进行判断,遍历一次就加上一;直到符合条件则输出NO
这是错误的案例,所以修改后为这样

System.out.println("请输入一个单词");
        Scanner input = new Scanner(System.in);
        String danci = input.next();
        int count=0;
        for(int j=0;j<name.length;j++){
            if(danci.equals(name[j])){
                System.out.println("YES");
                break;
            }
            count++;
            if(count==10){
                System.out.println("NO");
            }
        }

        System.out.println("程序结束");

思路
首先将 输入的单词都放进数组里面,然后再用FOR循环遍历比较
是则输出YES 否则则输出NO

2.合并数组操作:现有如下一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: int newArr [] ={1,3,4,5,6,6,5,4,7,6,7,5}

import java.util.Arrays;

public class Test6 {
    public static void main(String[] args) {
        int count=0;
        int []oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
        for(int i=0;i<oldArr.length;i++){

            if(oldArr[i]!=0){
                count++;
            }
        }
        int []count_s=new int[count];

        int m=0;
        for(int j=0;j< oldArr.length;j++){
            if(oldArr[j]!=0){

                count_s[m]=oldArr[j];
                m++;
            }
        }
     //   Arrays.sort(count_s);

        for (int k=0;k<count_s.length;k++){
            System.out.print(count_s[k]+" ");
        }

    }
}

输出结果

1 3 4 5 6 6 5 4 7 6 7 5 
Process finished with exit code 0

思路
1先用FOR遍历出来不为0的元素有多少个作为新数组元素数量定义
2再次遍历,将不为0的元素依次放入新的数组(其中使用到m作为计数器来依次赋予新数组下标)
3遍历输出新数组,如果需要排序那就来个SORT

3. 题目:输入某年某月某日,判断这一天是这一年的第几天?

分析:以3月5日为例,先把前两个月的加起来,然后再加上5天即本年第几天,特殊情况,闰年且输入月份大于3需考虑多加一天。可定义数组存储1-12月各月天数。

public class Test8 {
    public static void main(String[] args) {
        int []mouthDay={31,28,31,30,31,30,31,31,30,31,30,31};
        System.out.println("请输入今天的年份:");
        Scanner input = new Scanner(System.in);
        int year = input.nextInt();//String类型后面不用写
        System.out.println("请输入今天的月份");
        int mouth = input.nextInt();
        System.out.println("请输入今天的日子");
        int day = input.nextInt();

        int tianshu=0;
        int sum=0;
        if((year%100!=0)&&(year%4==0)||(year%400==0)){
            System.out.println("该年为闰年");
            if(mouth>=3){
                for(int k=0;k<mouth-1;k++){
                    sum+=mouthDay[k];
                }tianshu=sum+day+1;
                System.out.println("现在是今年的第"+tianshu+"天");
            }
            else{
                for(int m=0;m<mouth-1;m++) {
                    sum += mouthDay[m];
                }tianshu=sum+day;
                System.out.println("现在是今年的第"+tianshu+"天");
            }
        }else{
            System.out.println("该年不为闰年");
            for(int j=0;j<mouth-1;j++) {
                sum += mouthDay[j];
            }tianshu=sum+day;
            System.out.println("现在是今年的第"+tianshu+"天");
        }

    }
}

输出结果

请输入今天的年份:
2000
请输入今天的月份
3
请输入今天的日子
1
该年为闰年
现在是今年的第61
请输入今天的年份:
1999
请输入今天的月份
1
请输入今天的日子
1
该年不为闰年
现在是今年的第1

思路整理
1先筛选出闰年的条件
2判断出闰年且为三月份以上则加一天 ,否则不加
3跳出判断,不为闰年则为正常计算,将数组里对应月份和天数加起来即可

总结
写的时候细心,注意下标的书写,否则可能出现溢出

数组中Arrays类的应用
在这里插入图片描述
只能说十分好用
调用方法为 Arrays.sort( );
等等。。

============================================================================
四.
m 个人的成绩存放在 score 数组中,
请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,
将低于平均分的人数放在 below 所指的数组中

import java.util.Arrays;
import java.util.Scanner;

/**
 * @AUTHOR : FKU! JAVA
 * @DATE 2022/7/2  17:20
 * @TODO
 *
 *
 *  * m 个人的成绩存放在 score 数组中,
 *  * 请编写函数 fun,它的功能是:将低于平均分的人数作为函数值返回,
 *  * 将低于平均分的人数放在 below 所指的数组中
 */
public class TTT {
    public static void main(String[] args) {

        int sum=0;
        int avg=0;
        System.out.println("请输入所需输入成绩的人数:");
        Scanner input = new Scanner(System.in);
        int m = input.nextInt();
        int[] score = new int[m];


        for (int i = 0; i < score.length; i++) {

            System.out.print("第"+(i+1)+"个学生的成绩为");
            int scores = input.nextInt();
            System.out.println(scores);
            score [i]=scores;
            sum+=scores;
        }
        avg=sum/m;
        System.out.println("========================================");
        System.out.println("score[]="+Arrays.toString(score));
        System.out.println("平均分为:"+avg);


        int [] back=new int[5];

        System.out.println(fun(score,back,avg));

        int [] newback =Arrays.copyOf(back,fun(score,back,avg));
        System.out.println(Arrays.toString(newback));
    }




    public static  int fun(int[]arrBack,int[]back_s,int avg ) {
        int count_k=0;
        for (int k = 0; k < arrBack.length; k++) {
            if (arrBack[k] < avg) {
                back_s[count_k]=arrBack[k];
                count_k++;
            }

        }


        return count_k;
    }
}

思路
1分为两个部分来写
第一部分主函数负责来将数据接受并放入一个数组;计算出平均分;将这些作为参数传入算法中
第二部分写FUN函数来实现将低于平均分的人数 和 他们的分数放入的数组作为返回数据;
最后将返回的数组用新的数组back来接受数据,因为刚返回数据并不知道为多少,我们大可将他定义为和score一样多的元素,接下来只需要在接到数据后再次使用copy of功能将数组的长度修改即可

输出结果


请输入所需输入成绩的人数:
61个学生的成绩为20
202个学生的成绩为30
303个学生的成绩为40
404个学生的成绩为50
505个学生的成绩为60
606个学生的成绩为70
70
========================================
score[]=[20, 30, 40, 50, 60, 70]
平均分为:45
3
[20, 30, 40]

Process finished with exit code 0
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值