求一个优秀算法,参与有分.

网络科技 2009-08-15 07:54:56
加精
基本需求如下:
1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情要做,但每人每次只允许做一件,并且从第一件开始做.

2.等到丁做完一件事后,休息1分钟,然后又从甲开始做剩下的事情,以此循环,直到四人都做完自己的所有事情.

以上为基本要求,附加扩展需求如下:
1.如果一件事做失败了,则记录它的做事者,以及失败原因,失败时间等,再输入到c:/note.txt,然后再跳过该件事,其它人继续进行.

2.当四人完成所有事情后,记录每人完成事情的所需的总时间以及成功率(或失败率),最好能用图表显示统计.

我想方法可能不少,但效率可能有别,此算法看似简单,但要运用的知识点却不少,线程,异常处理,循环应用,文件操作等等,
对一般人练练手应该还是有意义的啦.

大家有兴趣也来露两手如何?附加要求可以不考虑.本人的就不贴上去献丑了,呵

最后说下,本人认为该需求用于面试也不错,如果有人能在30分钟内完成,水平应该是相当不错的(使用时间越少,正确率越高,相对来说被面试者水平越高)
当然如果你认为是这是作业题或太简单了而不屑一顾的话,那你可以绕路了(此处已难以展现你才能了,人各有志吧,水平不同当然目标不同了,可以理解的,呵.)
...全文
1402 120 打赏 收藏 举报
写回复
用AI写文章
120 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
看过
color_zy 2009-12-10
  • 打赏
  • 举报
回复
不懂
  • 打赏
  • 举报
回复
和呵呵,不会,只有顶!
Defonds 2009-08-19
  • 打赏
  • 举报
回复
mark
donil 2009-08-19
  • 打赏
  • 举报
回复
看看
wonder888888 2009-08-19
  • 打赏
  • 举报
回复
帮顶,接分
cdxhz 2009-08-19
  • 打赏
  • 举报
回复
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
lllsui 2009-08-18
  • 打赏
  • 举报
回复
0
yxh1226 2009-08-18
  • 打赏
  • 举报
回复
受益匪浅啊
maweina1990 2009-08-18
  • 打赏
  • 举报
回复
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException
{
String[] jobs = new String[40];//每人都要做十件事,四个人总共40件,就定义得40长度的数组吧
int a = 0,b = 0,c = 0,d = 0;//分别为每人正在做第几件事
int failA = 0,failB = 0,failC = 0,failD = 0;//记录每人做事失败的次数(统计用的)

for (int i = 0; i < jobs.length; i++)
{
if (i % 4 == 0)
{
try
{
System.out.println("甲正在做的第 " + (++a) + " 件事成功了!");
}
catch (Exception e)
{
System.out.println("甲正在做的第 " + (++a) + " 件事失败了!");
failA++;
}
}
else if (i % 4 == 1)
{
try
{
System.out.println("乙正在做的第 " + (++b) + " 件事成功了!");
}
catch (Exception e)
{
System.out.println("乙正在做的第 " + (++b) + " 件事失败了!");
failB++;
}
}
else if (i % 4 == 2)
{
try
{
System.out.println("丙正在做的第 " + (++c) + " 件事成功了!");
}
catch (Exception e)
{
System.out.println("丙正在做的第 " + (++c) + " 件事失败了!");
failC++;
}
}
else if (i % 4 == 3)
{
try
{
System.out.println("丁正在做的第 " + (++d) + " 件事成功了!");
}
catch (Exception e)
{
System.out.println("丁正在做的第 " + (++d) + " 件事失败了!");
failD++;
}

Thread.sleep(60000);//丁做完后,休息一分钟(我是用线程休眠来"休息"的)
}
}

System.out.println("甲做事成功率:"+ (a - failA) / (0.01 * a));
System.out.println("乙做事成功率:"+ (b - failB) / (0.01 * b));
System.out.println("丙做事成功率:"+ (c - failC) / (0.01 * c));
System.out.println("丁做事成功率:"+ (d - failD) / (0.01 * d));

}

我觉得这个想法很好,只是如果能够将判断是否成功的方法放在人做事的函数里就更好了
hzj72 2009-08-18
  • 打赏
  • 举报
回复
帮顶,接分
chenyi8894215 2009-08-18
  • 打赏
  • 举报
回复
进来看看
yangxing1209 2009-08-18
  • 打赏
  • 举报
回复
呵呵,PHP这个我喜欢,我之前使用了四年。不过这些东西是各有各的领域,各有各的所长,总之都可以用来描述算法。
hs1988 2009-08-18
  • 打赏
  • 举报
回复
php,每一件事平均消耗时间为1-5分钟,默认成功率为75%

<?php
$record = array(
'a'=>array('num'=>0,'total_time'=>0,'success'=>0),
'b'=>array('num'=>0,'total_time'=>0,'success'=>0),
'c'=>array('num'=>0,'total_time'=>0,'success'=>0),
'd'=>array('num'=>0,'total_time'=>0,'success'=>0),
'total_time'=>0
);

$record['a']['num'] = rand(5,15);
$record['b']['num'] = rand(5,15);
$record['c']['num'] = rand(5,15);
$record['d']['num'] = rand(5,15);

for($i=0;$i<15;$i++){
for($j=0;$j<4;$j++){
$people = substr('abcd',$j,1);
if($i<$record[$people]['num']){
_do($people,$record);
if($i<$record[$people]['num']-1) $record['total_time'] += 4;
}
}
}
print("-----<br />");
print("total cost {$record['total_time']} minutes.<br />");
_print('a',$record);
_print('b',$record);
_print('c',$record);
_print('d',$record);

function _do($people,&$record){
$cost_time = rand(1,5);
$is_success = rand(0,3);
print("user $people: cost $cost_time minute(s), ".($is_success>0?'success':'failure')."!<br />");
$record['total_time'] += $cost_time;
$record[$people]['total_time'] += $cost_time;
if($is_success>0) $record[$people]['success'] += 1;
}

function _print($people,$record){
print("user $people: total cost {$record[$people]['total_time']} minutes, success rate {$record[$people]['success']}/{$record[$people]['num']}<br />");
}
?>


输入结果:

user a: cost 1 minute(s), success!
user b: cost 3 minute(s), failure!
user c: cost 4 minute(s), success!
user d: cost 4 minute(s), success!
user a: cost 5 minute(s), success!
user b: cost 2 minute(s), success!
user c: cost 1 minute(s), success!
user d: cost 2 minute(s), success!
user a: cost 5 minute(s), success!
user b: cost 3 minute(s), success!
user c: cost 4 minute(s), failure!
user d: cost 1 minute(s), success!
user a: cost 1 minute(s), failure!
user b: cost 2 minute(s), success!
user c: cost 4 minute(s), failure!
user d: cost 4 minute(s), success!
user a: cost 4 minute(s), failure!
user b: cost 4 minute(s), success!
user c: cost 1 minute(s), success!
user d: cost 2 minute(s), failure!
user a: cost 2 minute(s), success!
user b: cost 2 minute(s), success!
user c: cost 2 minute(s), success!
user d: cost 1 minute(s), success!
user a: cost 2 minute(s), success!
user b: cost 5 minute(s), success!
user c: cost 4 minute(s), success!
user d: cost 3 minute(s), success!
user a: cost 5 minute(s), success!
user b: cost 4 minute(s), success!
user c: cost 5 minute(s), failure!
user d: cost 2 minute(s), success!
user a: cost 2 minute(s), failure!
user b: cost 1 minute(s), success!
user c: cost 3 minute(s), success!
user d: cost 3 minute(s), success!
user a: cost 2 minute(s), success!
user b: cost 1 minute(s), success!
user c: cost 3 minute(s), failure!
user d: cost 1 minute(s), success!
user a: cost 3 minute(s), success!
user b: cost 4 minute(s), success!
user c: cost 4 minute(s), success!
user d: cost 1 minute(s), success!
user a: cost 1 minute(s), success!
user c: cost 2 minute(s), failure!
user d: cost 5 minute(s), success!
user c: cost 4 minute(s), success!
user d: cost 3 minute(s), success!
user c: cost 4 minute(s), failure!
user d: cost 3 minute(s), failure!
user c: cost 5 minute(s), success!
-----
total cost 341 minutes.
user a: total cost 33 minutes, success rate 9/12
user b: total cost 31 minutes, success rate 10/11
user c: total cost 50 minutes, success rate 9/15
user d: total cost 35 minutes, success rate 12/14
yangxing1209 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 93 楼 maweina1990 的回复:]
/**
    * @param args
    * @throws InterruptedException
    */
    public static void main(String[] args) throws InterruptedException
    {
        String[] jobs = new String[40];//每人都要做十件事,四个人总共40件,就定义得40长度的数组吧
        int a = 0,b = 0,c = 0,d = 0;//分别为每人正在做第几件事
        int failA = 0,failB = 0,failC = 0,failD = 0;//记录每人做事失败的次数(统计用的)
       
        for (int i = 0; i < jobs.length; i++)
        {
            if (i % 4 == 0)
            {
                try
                {
                    System.out.println("甲正在做的第 " + (++a) + " 件事成功了!");
                }
                catch (Exception e)
                {
                      System.out.println("甲正在做的第 " + (++a) + " 件事失败了!");
                      failA++;
                }
            }
            else if (i % 4 == 1)
            {
                try
                {
                    System.out.println("乙正在做的第 " + (++b) + " 件事成功了!");
                }
                catch (Exception e)
                {
                      System.out.println("乙正在做的第 " + (++b) + " 件事失败了!");
                      failB++;
                }
            }
            else if (i % 4 == 2)
            {
                try
                {
                    System.out.println("丙正在做的第 " + (++c) + " 件事成功了!");
                }
                catch (Exception e)
                {
                      System.out.println("丙正在做的第 " + (++c) + " 件事失败了!");
                      failC++;
                }
            }
            else if (i % 4 == 3)
            {
                try
                {
                    System.out.println("丁正在做的第 " + (++d) + " 件事成功了!");
                }
                catch (Exception e)
                {
                      System.out.println("丁正在做的第 " + (++d) + " 件事失败了!");
                      failD++;
                }
               
                Thread.sleep(60000);//丁做完后,休息一分钟(我是用线程休眠来"休息"的)
            }
        }
       
        System.out.println("甲做事成功率:"+ (a - failA) / (0.01 * a));
        System.out.println("乙做事成功率:"+ (b - failB) / (0.01 * b));
        System.out.println("丙做事成功率:"+ (c - failC) / (0.01 * c));
        System.out.println("丁做事成功率:"+ (d - failD) / (0.01 * d));

    }

我觉得这个想法很好,只是如果能够将判断是否成功的方法放在人做事的函数里就更好了
[/Quote]
这段代码最大的问题在 “for (int i = 0; i < jobs.length; i++)”,你只让程序做四十件事,但是假如失败了,你得让程序再做,直到所有的做成功为止,你这是每件事只做一次,成功与否不管,反正统计就行了,但是到最后不一定所有事情都做完了。当然其它方面肯定也是有问题的,不过都是由于这个问题所引来的。
yangxing1209 2009-08-18
  • 打赏
  • 举报
回复
78 楼的snakegod应该仔细分析下那段乱码,只怕不是你所认为的那样,告诉你个秘密,continue这那里作怪,呵呵,一般人我不告诉他!
ethanxiong 2009-08-18
  • 打赏
  • 举报
回复
xiaohai0916 2009-08-18
  • 打赏
  • 举报
回复
太强了~
ylzhang97 2009-08-18
  • 打赏
  • 举报
回复
vb 东西,学习啦
ziwei_1986 2009-08-18
  • 打赏
  • 举报
回复
楼主真逗!
这跟算法有关系么?!
和线程有关系么?!
呵呵!
不过精神可嘉!
加载更多回复(99)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧