A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-唐磊 中级黑马   /  2012-9-18 23:48  /  4327 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-唐磊 于 2012-9-19 10:38 编辑

最近看到很多人,在论坛上求各种题目练练手,好吧那我就出一个简单小题,大家有兴趣就做做,对了第一题完全是我个人出的,第二题我改了一些,会有一些不完善之处,望大家多多包涵,做完后大家搞成压缩格式发上来,我会要求版主给你们加分的
第一题:参考张孝祥老师的银行调度系统做一个类似的用多线程模拟网吧管理系统,在控制台打印出结果。要求如下:非会员包间3元一小时,普通座位2元,会员普通座位1元每小时,包间2元一小时。并随机出现各种网民(会员非会员),并机缴一定数额纳押金范围为2-100元之间,然后随机选择普通座位和包间,当这个网民上网完后,要在控制台上打印出他的上网时间,缴纳押金,找零现金。需要注意点1,网吧座位为50个,1-40为普通机,41-50为包间。网民上网时间为随机的,这个随机时间值不得超过他所缴纳押金内的时间值。3一个机号不能同时2人上,除非那个机号的人结账下机。4当座位已满是就不能再添加人了,只能等到这50台机有人结账下机时,那台结账的机号才能在添加人进来。5,当结账下机时,那台结账的机号就应该等待,等待下次得到任务。大致流程如下
1号普通机正在等待
4号普通机正在等待
........
1号普通机来一普通网民,缴纳押金15元
4号普通机来一会员,交纳押金10元
41号包间来一普通网民缴纳押金20元
42号包间机来一会员缴纳押金30元
.....
1号普通机普通网民结账下及,上网5小时,交纳押金15元,找零5元
1号机正在等待
30号普通机来一会员缴纳押金20元
4号普通机会员结账下机上网10小时,缴纳押金10元找零0元
4号机正在等待
.......
座位已满
41号包间机普通网民结账下机,上网3小时,缴纳现金20元,找零11元
41号包间机正在等待....
41号包间机来一会员,缴纳现金40元
.......
第二题
从图中,我们可以发现26个字母分布在2-9这8个数字键上。某人的电话号码是65967427,观察单词“olympics”,可以发现:字母o位于数字键6上,字母l位于数字键5上,…字母s位于数字键7上。此时,我们说olympics是65967427对应的一个字母组合。65967427还可以对应其它很多种字母组合,例如:mjwmpgap也是其中之一。输入为一个电话号码(允许输入为3位到11位的十进制数),在控制台输出该数字对应的所有字母组合,并返回组合的总数。如果数字中包含1或者0,由于没有与之对应的字母,则直接返回0。当数字小于3位或者大于11位时,亦没有对应字母组合,返回0。

phone.jpg (27.4 KB, 下载次数: 37)

phone.jpg

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

18 个回复

倒序浏览

回帖奖励 +5

瞧瞧~~~~~~~~~~~~~
回复 使用道具 举报
又来活动了?
回复 使用道具 举报

回帖奖励 +5

不错呀!!!~~~~~~
回复 使用道具 举报

回帖奖励 +5

看看,see see
回复 使用道具 举报

回帖奖励 +5

楼主真给力啊
回复 使用道具 举报

回帖奖励 +5

kankan................
回复 使用道具 举报

回帖奖励 +5

没事瞎溜达。。
回复 使用道具 举报
不错哦,试试!
回复 使用道具 举报
有没有人正在尝试做啊
回复 使用道具 举报
路过 瞧瞧!!
回复 使用道具 举报
尝试做了第二题,上午做了一个多小时,现在功能已经实现,主要原理是采用递归实现的。
详细代码如下:
import java.util.ArrayList;
import java.util.List;


public class Test2 {
        private static String message="";
        static List<String> list=new ArrayList<String>();//这里我只是把功能实现了,至于其它的,接收字符串,还有验证是否是正确的数字及长度
        private static int counts=0;                                        //只有留给调用此方法的人去做了
        public static void main(String[] args){
                String s="327523";
                System.out.println("总共有:"+method(s)+"条信息");          //调用方法并返回行数
        }
        public static int method(String str){
                if(str.length()>0){                                //用于判断递归后的字符串长度,不能为0
                        char[] a0={'0'};                        //以下为对应的各个数字中的字母 其中0和1只认为有0这个字符
                        char[] a1={'0'};
                        char[] a2={'a','b','c'};
                        char[] a3={'d','e','f'};
                        char[] a4={'g','h','i'};
                        char[] a5={'j','k','l'};
                        char[] a6={'m','n','o'};
                        char[] a7={'p','q','r','s'};
                        char[] a8={'t','u','v'};
                        char[] a9={'w','x','y','z'};
                        if(str.charAt(0)==48){                        //str.charAt(0)方法判断首字母是0~9之中的哪一个,因为根据ascii表,0是49,9是57
                                for(int i=0;i<a0.length;i++){                //根据如果是0 则为数组a0,根据数组长度判断循环次数
                                        message+=a0[i];                                        //将0对应的字符添加到字符串message末尾
                                        list.add(message);                                //全部添加到list集合中,最后再来排除不够长度的
                                        method(new String(str).substring(1,str.length()));        //递归,此题的主要原理就用的这个
                                        message=message.substring(0,message.length()-1 );        //递归后,message要减去新添加的那个字符
                                }
                        }
                        else if(str.charAt(0)==49){                        //其它的以此判断是否是1,2,3,4,5,6,7,8,9..后面注释省略
                                for(int i=0;i<a1.length;i++){        //虽然这样有些繁琐,但是鄙人才疏学浅,暂时没有想到其它方法 switch应该也行
                                        message+=a1[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==50){
                                for(int i=0;i<a2.length;i++){
                                        message+=a2[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==51){
                                for(int i=0;i<a3.length;i++){
                                        message+=a3[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==52){
                                for(int i=0;i<a4.length;i++){
                                        message+=a4[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==53){
                                for(int i=0;i<a5.length;i++){
                                        message+=a5[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==54){
                                for(int i=0;i<a6.length;i++){
                                        message+=a6[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==55){
                                for(int i=0;i<a7.length;i++){
                                        message+=a7[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==56){
                                for(int i=0;i<a8.length;i++){
                                        message+=a8[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        else if(str.charAt(0)==57){
                                for(int i=0;i<a9.length;i++){
                                        message+=a9[i];
                                        list.add(message);
                                        method(new String(str).substring(1,str.length()));
                                        message=message.substring(0,message.length()-1 );
                                }
                        }
                        String[] strings=list.toArray(new String[list.size()]);                //把list赋值给String【】
                        int count=strings[0].length();                //count用来判断list中的最大长度
                        for(int i=0;i<strings.length;i++){
                                if(strings[i].length()>count)
                                        count=strings[i].length();
                        }
                        for(int i=0;i<strings.length;i++){                //必须等于最大长度且等于字符串长度的才是合格的字符串
                                if(strings[i].length()==count&&count==str.length()){
                                        System.out.println(strings[i]);
                                        counts=counts+1;   //类中的静态变量,用来统计合格字符的个数,以便返回
                                }
                        }
                }
                return counts;                          //返回信息条数
        }
}

PS:上面做的可能不尽完善,如有不足还欢迎各位指出

评分

参与人数 1技术分 +2 收起 理由
田建 + 2 赞一个!

查看全部评分

回复 使用道具 举报
没注意到要上传文件 这里补上,忘大大们加点儿技术分,花了上午好久的时间的...

src.zip

3.11 KB, 下载次数: 139

评分

参与人数 1技术分 +1 收起 理由
admin + 1 我再奖1分

查看全部评分

回复 使用道具 举报
请版主给张小龙加两分技术分,谢谢。理由是他确实费了功夫,虽然有一小部分功能没有实现(“如果数字中包含1或者0,由于没有与之对应的字母,则直接返回0。还有当数字小于3位或者大于11位时,亦没有对应字母组合,返回0”就这两点没能实现)但毕竟能做成这样子也很不错了,也作为鼓励新手。

点评

分数已加!  发表于 2012-9-19 22:24
回复 使用道具 举报
这是第二题  请楼主批阅!!谢谢

王宝龙_Test_2.zip

4.35 KB, 下载次数: 163

回复 使用道具 举报
请楼主批阅!!谢谢!!! 劳烦了!!!  刚刚 上传了  但是没有得到分啊 所以 又这样传了一次!!!希望不吝惜分数  多给几个    呵呵 {:soso_e113:}
  1. /*第二题
  2. * 从图中,我们可以发现26个字母分布在2-9这8个数字键上。某人的电话号码是65967427,观察单词“olympics”,
  3. * 可以发现:字母o位于数字键6上,字母l位于数字键5上,…字母s位于数字键7上。此时,我们说olympics是65967427对应的一个字母组合。
  4. *65967427还可以对应其它很多种字母组合,例如:mjwmpgap也是其中之一。输入为一个电话号码(允许输入为3位到11位的十进制数),
  5. * 在控制台输出该数字对应的所有字母组合,并返回组合的总数。如果数字中包含1或者0,由于没有与之对应的字母,则直接返回0。当数字小于3位或者大于11位时 ,
  6. *亦没有对应字母组合,返回0。
  7. *@author 王宝龙
  8. * */
  9. import java.util.*;
  10. import java.io.*;

  11. class MyMap//定义MyMap类将手机健数字对应的字母存入HashMap中
  12. {
  13.         private HashMap<Integer,String> hm = new HashMap<Integer,String>();

  14.         public MyMap()
  15.         {
  16.                 hm.put(2,"abc");
  17.                 hm.put(3,"def");
  18.                 hm.put(4,"ghi");
  19.                 hm.put(5,"jkl");
  20.                 hm.put(6,"mno");
  21.                 hm.put(7,"pqrs");
  22.                 hm.put(8,"tuv");
  23.                 hm.put(9,"wxyz");
  24.         }
  25.         public HashMap<Integer,String> getHm()
  26.         {
  27.                 return hm;
  28.         }
  29. }
  30. class Second
  31. {
  32.         public static void main(String[] arge)
  33.         {
  34.                 InputStream in = null;
  35.                 String s2 = "";
  36.                 int s = 0;
  37.                
  38.                 //输入读取
  39.                 sop(6789);
  40.                 PrintCombination("6789");
  41.                 try
  42.                 {
  43.                         in = System.in;
  44.                         sop("上面的做个示范\n\n请输入电话号码");
  45.                         while((s=in.read())!='\r')
  46.                         {
  47.                                 s2=s2+String.valueOf((char)s);
  48.                         }
  49.                 }
  50.                 catch(IOException e)
  51.                 {
  52.                         sop(e.toString());
  53.                 }
  54.                
  55.                 PrintCombination(s2);
  56.         }
  57.         public static int  PrintCombination(String s)
  58.         {
  59.                 MyMap mm = new MyMap();
  60.                 HashMap<Integer,String> a2= new HashMap<Integer,String>();
  61.                 String str3 = "";
  62.                 String str2 = "";
  63.                
  64.                 int IntSum = 1;
  65.                 int[] Num ={0,0,0,0,0,0,0,0,0,0,0};//存储每一个字符串当前应该打印的角标
  66.                 //建立一个标志位
  67.                 boolean[] flag = {false,false,false,false,false,false,false,false,false,false,false};       
  68.                
  69.                 if(s.length()>11||s.length()<3)//判断是否是大于11小于3
  70.                 {                                                                //如果不是则返回0
  71.                         sop("输入数据不合法输入数据必须为大于3小于11");
  72.                         return 0;
  73.                 }
  74.                 if(s.contains("1")||s.contains("0"))//判断是否存在0和1;
  75.                 {                                                                        //存在返回0;
  76.                         sop("输入数据不合法数据不应包含1或者0");
  77.                         return 0;
  78.                 }
  79.                 for(int i=0;i<s.length();i++)//遍历输入的字符串将结果存入a2,同时计算有多少种排列方式存入IntSum中
  80.                 {
  81.                         //将数字对应的的字母存入al中
  82.                         int a = Integer.parseInt(s.substring(i,i+1));
  83.                         String sTemp = mm.getHm().get(a);
  84.                         a2.put(i,sTemp);
  85.                         IntSum = IntSum * sTemp.length();//计算排列的总数
  86.                 }
  87.                
  88.                 for(int i=0;i<IntSum;i++)//根据Num数组输出组合数
  89.                 {
  90.                         for(int j=0;j<a2.size();j++)
  91.                         {
  92.                                 str2 = a2.get(j);
  93.                                 System.out.print(str2.charAt(Num[j]));
  94.                                
  95.                         }
  96.                         System.out.print(",");
  97.                         if(i%10==0)
  98.                         {
  99.                                 sop("");
  100.                         }
  101.                        
  102.                         //sop(a2.size());
  103.                         //sop(a2.get(7));
  104.                         for(int x=a2.size();x>0;x--)//改变Num数组数,关键就在这里了
  105.                         {
  106.                                
  107.                                 str3 = a2.get(x-1);
  108.                                
  109.                                 int Len = str3.length();
  110.                                
  111.                                 if(x<a2.size())
  112.                                 {
  113.                                         if(flag[x])
  114.                                         {
  115.                                                 if(Num[x-1]==Len-1)
  116.                                                 {
  117.                                                         Num[x-1]=0;
  118.                                                         flag[x-1]=true;
  119.                                                         flag[x] = false;
  120.                                                 }
  121.                                                 else
  122.                                                 {
  123.                                                         Num[x-1]++;       
  124.                                                         flag[x] = false;
  125.                                                 }
  126.                                         }
  127.                                 }
  128.                                 else
  129.                                 {
  130.                                         if(Num[x-1]==Len-1)
  131.                                         {
  132.                                                 Num[x-1]=0;
  133.                                                 flag[x-1]=true;
  134.                                         }
  135.                                         else
  136.                                         {
  137.                                                 Num[x-1]++;
  138.                                                 flag[x-1]=false;
  139.                                         }
  140.                                 }
  141.                         }
  142.                 }
  143.                 sop("");
  144.                 sop("总计排列数:"+IntSum+"\n");//输出总计有多少种
  145.                 return 1;
  146.         }
  147.         public static void sop(Object obj)//输出函数
  148.         {
  149.                 System.out.println(obj);
  150.         }
  151. }





复制代码
回复 使用道具 举报
本帖最后由 陈振兴 于 2012-9-24 10:19 编辑

昨晚才看到题!
第一题!

遗留问题:
未实现功能:
我不知道怎么用一个状态来切换普通机下的普通网名和会员,包间也是?我想问一下在一个线程池,根据重要性进程 有优先级,多线才程的并发一般不是程序员决定,而是容器决定,这又是怎么理解(我昨天就遇到这问题)?所以我就卡在这块了?请指点?(昨晚写的,今天早晨还是未能实现在线程下切换状态)求指点!


a.png (17.58 KB, 下载次数: 49)

a.png

Net_Bar.rar

13.95 KB, 下载次数: 147

第一题

回复 使用道具 举报
本帖最后由 陈振兴 于 2012-9-24 10:22 编辑

楼主是不是我思路太窄了啊!我感觉怎么就突破不了这块呢!我那个“座位已满”的上限我都不知道怎么来处理!真晕啊!感觉写的好烂!
回复 使用道具 举报
本帖最后由 王宝龙 于 2012-9-24 19:17 编辑

楼主 为什么  我做了第二题一点却反应都没有啊!!是错是对 楼主总得给个回复吧!!谢谢了!!{:soso_e114:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马