黑马程序员技术交流社区

标题: 今天贤哥给的两道java题,拿给大家共享下 [打印本页]

作者: chenxianzai    时间: 2015-11-15 23:19
标题: 今天贤哥给的两道java题,拿给大家共享下
今天贤哥给的两道java题,拿给大家共享下,大牛们各显神通啊
上海五期的小伙伴们先别发答案呢

第一题、
一个网站有这样的一个功能,你输入你的年龄,就会自动显示你的年龄段, 输入0-10 输出儿童
输入10-20 青少年
输入20-30 青年
输入30- 40中年
输入40-50 中老年
输入50-60 老年
输入60-70 耄耋之年
咱们也做这样一个功能 键盘录入一个年龄输出对应的年龄段 (这道题的要求是用最高的效率输出这个年龄段)



第二题‘
0-99共100个整数,放到一个数组中,位置是随机的将其中一个数37,挑出来,
        换成不是这个数字的另一个数45,(意思就是说 现在0-99这100个数中 37是重复的,而45呢有两个)
        这100个数里面有一个数字是重复的,还有一个数字是没有的,将这个重复的数字找出来,用最快的方式
        (提示:用数据结构的思想。如果想不出来就用自己的想法做)







作者: wucong007    时间: 2015-11-15 23:19


/*
*         0-99共100个整数,放到一个数组中,位置是随机的
*        将其中一个数37,挑出来,换成不是这个数字的另一个数45
*        有一个数字是重复的,还有一个数字是没有的
*        将这个重复的数字找出来,用最快的方式
*/
public class Demo1 {
        public static void main(String[] args) {
               
                //定义一个100长度的数组
                int[] arr = new int[100];
               
                //从1-100初始化
                for (int i = 0; i <100; i++) {
                        arr[i]=i;
                }
               
                //把37换成45,那么这100个数中,37是没有的,45是重复的
                arr[37]=45;
               
                //打乱数组的里面的值的位置,让位置随机
                changePosition(arr);
               
               

                //定义一个临时数组,那么里面的初始数都是0
                int[] temp = new int[arr.length];
               
                //遍历数组arr,以arr里面的值作为临时数组temp的索引
                for(int i = 0;i<arr.length;i++){
                        //让临时数组temp对应的值都加1 ,这时候 temp的索引是0-99,temp对应索引37位置上就是0,对应45位置上就是2
                        temp[arr[i]]++;
                       
                        //数值是2的则重复,因为 temp的索引45位置上加了两次
                        if(temp[arr[i]]==2){
                                System.out.println(arr[i]+"重复");
                        }
                }
               
        }
       
        /**
         * 打算数组的顺序
         * @param arr        需要打乱顺序的数组
         */
    public static void changePosition(int[] arr) {

            Random random = new Random();
            int length = arr.length;
        for(int index=length-1; index>=0; index--) {

            //从0到index处之间随机取一个值,跟index处的元素交换

            exchange(arr, random.nextInt(index+1), index);

        }

    }

      

    /**
     * 交换数组中的两个数的位置
     * @param arr         需要交换位置的数组
     * @param p1        被交换位置的索引
     * @param p2        被交换位置的索引
     */
    public static void exchange(int[] arr, int p1, int p2) {

        int temp = arr[p1];

        arr[p1] = arr[p2];

        arr[p2] = temp;

    }
}package cn.itcast.demo;


import java.util.Scanner;

public class Demo1 {
        public static void main(String[] args) {
                /*
                 * 一个网站有这样的一个功能,你输入你的年龄,就会自动显示你的年龄段, 输入0-10 输出儿童 输入10-20 青少年 输入20-30 青年
                 * 输入30-40 中年 输入40-50 中老年 输入50-60 老年 输入60-70 耄耋之年
                 *
                 * 咱们也做这样一个功能 键盘录入一个年龄输出对应的年龄段 (这道题的要求是用最高的效率输出这个年龄段)
                 */
                Scanner sc = new Scanner(System.in);
                int age = sc.nextInt();
                method1(age);

        }

        private static void method1(int age) {
                if (age > 0 && age < 11) {
                        System.out.println("儿童 ");
                } else if (age > 10 && age < 21) {
                        System.out.println("青少年 ");
                } else if (age > 20 && age < 31) {
                        System.out.println("青年 ");
                } else if (age > 30 && age < 41) {
                        System.out.println("中年 ");
                } else if (age > 40 && age < 51) {
                        System.out.println("中老年 ");
                } else if (age > 50 && age < 61) {
                        System.out.println("老年 ");
                } else if (age > 60 && age < 71) {
                        System.out.println("耄耋之年 ");
                }

        }

        private static void method2(int age) {
                if (age < 11 && age > 0) {
                        System.out.println("儿童 ");
                } else if (age < 21 && age > 10) {
                        System.out.println("青少年 ");
                } else if (age < 31 && age > 20) {
                        System.out.println("青年 ");
                } else if (age < 41 && age > 30) {
                        System.out.println("中年 ");
                } else if (age < 51 && age > 40) {
                        System.out.println("中老年 ");
                } else if (age < 61 && age > 50) {
                        System.out.println("老年 ");
                } else if (age < 71 && age > 60) {
                        System.out.println("耄耋之年 ");
                }

        }
        private static void method3(int age) {       
                String[] ages={"儿童","少年","青年","壮年","中年","中老年","老年"};
                System.out.println(ages[age/10]);
        }

}
作者: zypt0218    时间: 2015-11-15 23:34
我是Java小白,,入门没多久,
我只知道switch语句做第一题
作者: chenxianzai    时间: 2015-11-15 23:36
zypt0218 发表于 2015-11-15 23:34
我是Java小白,,入门没多久,
我只知道switch语句做第一题

switch的效率有点抵啊
作者: candlelight    时间: 2015-11-15 23:44
能点明一下用啥实现第一题吗,switch和if都可以
作者: zhauibuzhai    时间: 2015-11-16 00:17
我想要你这分.{:2_32:}{:2_32:}因为我知道答案
作者: 王开冰    时间: 2015-11-16 11:29
这题对我来说有点难度了
作者: 小龙2015    时间: 2015-11-16 17:44
第一道题用switch语句做,第二道题:将假设a重复了2次,b缺失,则数组求和以后减去(1+2+3+……+99)以后得到的就是a-b的值,同时对数组求平方和然后减去(1*1+2*2+……+99*99)得到a*a-b*b的值,然后解方程组可以得到a的值,同时也可以得到b的值。代码如下:                                                                                                  
int method4(int a[])  
{  
     int i,sum1=0,sum2=0;  
     for(i=0;i<SIZE;i++)  
     {  
         sum1 = sum1 + a[i] - i;  
         sum2 = sum2 + a[i]*a[i] - i*i;  
     }  
     sum2 = sum2/sum1;  
     return (sum1+sum2)/2;  
}  
作者: 从哪里来    时间: 2015-11-16 19:19
草鸟一个,我为什么还敢来技术版。
作者: 新火燎塬521    时间: 2015-11-16 20:34
第一题
  1. import java.util.Scanner;

  2. public class Demo {
  3.         public static void main(String[] args) {
  4.                 String[] s = {"儿童","青少年","青年","中年","中老年","老年"," 耄耋之年"};
  5.                 Scanner sc = new Scanner(System.in);
  6.                 while(true){
  7.                         int age = sc.nextInt();
  8.                         if(age>=0&&age<70){
  9.                                 System.out.println("请输入年龄");
  10.                                 System.out.println(s[age/10]);       
  11.                         }else{
  12.                                 System.out.println("请输入0-70之间的年龄");
  13.                         }

  14.                 }
  15.         }
  16. }
复制代码

作者: chenxianzai    时间: 2015-11-16 22:56
candlelight 发表于 2015-11-15 23:44
能点明一下用啥实现第一题吗,switch和if都可以

用数组索引效率更高
作者: anoofeng    时间: 2015-11-16 23:31
本帖最后由 anoofeng 于 2015-11-16 23:34 编辑

第一题
#include <stdio.h>
int main(){
    int a;
    printf("请输入一个年龄:\n");
    scanf("%d",a);
    if (0<a&&a<=10) {
        printf("%d岁是儿童。");
    }
    if(10<a&&a<=20){
        printf("%d岁是青少年。");
    }
    if(20<a&&a<=40){
        printf("%d岁是青年。");
    }
    if(40<a&&a<=50){
        printf("%d岁是中年。");
    }
    if(50<a&&a<=60){
        printf("%d岁是中老年。");
    }
    if(60<a&&a<=70){
        printf("%d岁是耄耋年。");
    }
    if(a>=0||a>70){
        printf("对不起,你输入的年龄与上述的年龄段不符");
    }
}
第二题没啥想法~~楼下有大神解答吗?!看错了,进错~我还以为是iOS的~额~~~~汗~~
作者: 孜孜不倦    时间: 2015-11-17 15:25
第一个 switch语句,第二个 应该和 数据结构 中的 查找有关,知识有限只能提供这么多了。
作者: 特立独行    时间: 2015-11-18 20:50
自己试着做了一下第一道,不知道是不是最有效率的,请指点下有没有不合适的地方
  1. public static void main(String[] args) {
  2.                 Scanner sc = new Scanner(System.in);
  3.                 System.out.println("请输入你的年龄:");
  4.                         int x = sc.nextInt();

  5.                 if (x >= 0 && x <= 10) {
  6.                         System.out.println("儿童");
  7.                 }else if (x >= 10 && x <= 20) {
  8.                         System.out.println("青少年");
  9.                 }else if (x >= 20 && x <= 30) {
  10.                         System.out.println("青年");
  11.                 }else if (x >= 30 && x <= 40) {
  12.                         System.out.println("中年");
  13.                 }else if (x >= 40 && x <= 50) {
  14.                         System.out.println("中老年");
  15.                 }else if (x >= 50 && x <= 60) {
  16.                         System.out.println("耄耋之年");
  17.                 }else if (x >= 60 && x <= 70) {
  18.                         System.out.println("对不起,没有对应的年龄阶段!");
  19.                 }

  20.         }
复制代码


作者: 许玉飞嵩    时间: 2015-11-20 09:56
package com.itheima.test;
/**
*第一题,我觉得已经没有人比我这更高效和完善的了吧,我可能是黑马6期的
*/
import java.util.Scanner;

public class Test4 {

        public static void main(String[] args) {
               //高效且可循环输入的键盘录入
                Scanner input = new Scanner(System.in);
                while(input.hasNext())
                {
                        try
                        {       //控制输入的格式
                                Integer num = new Integer(input.next("[1-9][0-9]*"));
                               //输入886就结束循环
                                if(num==886)break;
                                if(num%10==0&&num<=140)
                                        System.out.println((num-10)+"-"+num);
                                else
                                if(num>140)
                                        System.out.println("您这岁数也太大了吧");
                                else
                                        System.out.println((num/10*10)+"-"+(num/10*10+10));
                        }catch(Exception e)
                        {
                                //当输入内容如果不符合正则要求,就异常结束,如带有字母,汉字,小数,负数都不合法                       
                                throw new RuntimeException("您输入的内容不合法,请输入正整数数字");
                        }
                }
        }
}

作者: 萧未然    时间: 2015-11-20 13:03
新火燎塬521 发表于 2015-11-16 20:34
第一题

学习了,巧妙的利用数组和取整
作者: mark_time    时间: 2015-11-20 15:49
话说 有人都给答案了  为什么楼下还是木有看到
作者: 崔节帅    时间: 2015-11-24 10:51
大家都好流弊的样子




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2