算法交流:分享我的一个算法,实现项目需求
2009-04-10 17:04
701 查看
昨天一个大三的师姐和我探讨了一个有关字符串解析的问题,我觉得比较有意思,于是今天下午抽出
20分钟实现了一下,因为这个项目是一个学院的选课系统,为了导数据方便呢,他们采用了之前选课系统的数据库。
其实这类web项目一般难度不会很大,但是这个早期的数据库设计的比较个性,其中记录上课时间的数据,在数据库
里竟然使用的是一个20位01串。因为我们学校一个学期最长是20周的课时。1代表这周有课,0代表没有课,最后要
解析这个字符串,把字符串解析成一个通俗的话,例如:数据库里存的是"00101111110111101110",那么通过这个
程序要转换成“3周 5-10周 12-15周 17-19周”。其实还是比较有意思的。当然我举的这个例子是比较夸张,因为
学校不可能这样排课。这样排课学生不就崩溃了。这么散乱。一般也就是00000000111111111111这种的,或者
11111111111100000000,但是既然实现一个算法,当然就要具有通用性,要把所有情况的考虑到。于是便有了
这个项目需求,因为这个项目使用java来搞,所以俺就以java为例,写一下实现。之前师姐用的是一些面向过程语言里
经常使用的一些数据类型,例如int,char,char[],String[]。既然用java,俺就不用这些东东了,用的也不方便,
就使用Integer,String,List<Integer>,List<String>。不过都说StringBuilder比较快,但是我还是没有用这个。
因为不熟,考虑到线程同步,也许有人会用StringBuffer,不过还是需要一个synchronized()来搞一下才放心。
本着实现为先,步步优化的原则,我就用最顺手的String了。一个算法的好坏,衡量是多方面的,代码精简,代码易读,
命名规范,灵活多变。这些都是衡量标准。但是有时要有所取舍。废话侃了那么多,如果有兴趣的朋友可以,试着用您
最擅长的语言或脚本写一写,或者考验一下自己的速度,或者追求一下最高的执行效率,实现一下,我觉得还是挺有意
思的。晚辈在这里请教各位,交流一下实现方案。如果有用java实现更高效的算法,我就不用现在我写的这个了,斗胆
发到首页,渴望交流学习。
------------------------------------------------------------------------------
我的实现:(就当抛砖引玉了)
Read01
1 package com.sy.string;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 public class Read01 {
7
8 public static String convert(String input) {
9
10 List<Integer> intList = new ArrayList<Integer>();//没有课的周
11 List<String> strList = new ArrayList<String>();//输出的字符串片段
12 String result = new String();//返回值
13 String string = input;//接受字符串
14 String clips=null;//中间变量:字符串片段
15 Integer temp=1;//中间变量:有课的周
16 Integer temp2=0;//中间变量:循环次数
17 Integer temp3=0;///中间变量:上一次循环是第几周
18
19 while (string.indexOf("0") != -1) {
20 intList.add(string.indexOf("0")+1+temp2);
21 string = string.substring(0, string.indexOf("0"))
22 + string
23 .substring(string.indexOf("0") + 1, string.length());
24 temp2++;
25 }
26 for (Integer num:intList) {
27 if(num-temp3==2){
28 strList.add((num-1)+"周 ");
29 }
30 if (num==1) {
31 clips="";
32 strList.add(clips);
33 } else {
34 clips=temp+"-"+(num-1)+"周 ";
35 if(temp<(num-1))
36 strList.add(clips);
37 }
38 temp=num+1;
39 temp3=num;
40 }
41 if(temp3<20){
42 if((temp3+1)==20){
43 strList.add("20周");
44 }else{
45 strList.add(temp3+1+"-20周");
46 }
47 }
48 for (String s:strList) {
49 result+=s;
50 }
51 return result;
52 }
53
54 public static void main(String[] args) {
55 String str = new String("00101111110111101110");
56 System.out.println(convert(str));
57 }
58 }
59
谢谢。
20分钟实现了一下,因为这个项目是一个学院的选课系统,为了导数据方便呢,他们采用了之前选课系统的数据库。
其实这类web项目一般难度不会很大,但是这个早期的数据库设计的比较个性,其中记录上课时间的数据,在数据库
里竟然使用的是一个20位01串。因为我们学校一个学期最长是20周的课时。1代表这周有课,0代表没有课,最后要
解析这个字符串,把字符串解析成一个通俗的话,例如:数据库里存的是"00101111110111101110",那么通过这个
程序要转换成“3周 5-10周 12-15周 17-19周”。其实还是比较有意思的。当然我举的这个例子是比较夸张,因为
学校不可能这样排课。这样排课学生不就崩溃了。这么散乱。一般也就是00000000111111111111这种的,或者
11111111111100000000,但是既然实现一个算法,当然就要具有通用性,要把所有情况的考虑到。于是便有了
这个项目需求,因为这个项目使用java来搞,所以俺就以java为例,写一下实现。之前师姐用的是一些面向过程语言里
经常使用的一些数据类型,例如int,char,char[],String[]。既然用java,俺就不用这些东东了,用的也不方便,
就使用Integer,String,List<Integer>,List<String>。不过都说StringBuilder比较快,但是我还是没有用这个。
因为不熟,考虑到线程同步,也许有人会用StringBuffer,不过还是需要一个synchronized()来搞一下才放心。
本着实现为先,步步优化的原则,我就用最顺手的String了。一个算法的好坏,衡量是多方面的,代码精简,代码易读,
命名规范,灵活多变。这些都是衡量标准。但是有时要有所取舍。废话侃了那么多,如果有兴趣的朋友可以,试着用您
最擅长的语言或脚本写一写,或者考验一下自己的速度,或者追求一下最高的执行效率,实现一下,我觉得还是挺有意
思的。晚辈在这里请教各位,交流一下实现方案。如果有用java实现更高效的算法,我就不用现在我写的这个了,斗胆
发到首页,渴望交流学习。
------------------------------------------------------------------------------
我的实现:(就当抛砖引玉了)
Read01
1 package com.sy.string;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 public class Read01 {
7
8 public static String convert(String input) {
9
10 List<Integer> intList = new ArrayList<Integer>();//没有课的周
11 List<String> strList = new ArrayList<String>();//输出的字符串片段
12 String result = new String();//返回值
13 String string = input;//接受字符串
14 String clips=null;//中间变量:字符串片段
15 Integer temp=1;//中间变量:有课的周
16 Integer temp2=0;//中间变量:循环次数
17 Integer temp3=0;///中间变量:上一次循环是第几周
18
19 while (string.indexOf("0") != -1) {
20 intList.add(string.indexOf("0")+1+temp2);
21 string = string.substring(0, string.indexOf("0"))
22 + string
23 .substring(string.indexOf("0") + 1, string.length());
24 temp2++;
25 }
26 for (Integer num:intList) {
27 if(num-temp3==2){
28 strList.add((num-1)+"周 ");
29 }
30 if (num==1) {
31 clips="";
32 strList.add(clips);
33 } else {
34 clips=temp+"-"+(num-1)+"周 ";
35 if(temp<(num-1))
36 strList.add(clips);
37 }
38 temp=num+1;
39 temp3=num;
40 }
41 if(temp3<20){
42 if((temp3+1)==20){
43 strList.add("20周");
44 }else{
45 strList.add(temp3+1+"-20周");
46 }
47 }
48 for (String s:strList) {
49 result+=s;
50 }
51 return result;
52 }
53
54 public static void main(String[] args) {
55 String str = new String("00101111110111101110");
56 System.out.println(convert(str));
57 }
58 }
59
谢谢。
相关文章推荐
- 分享一个本人开发的angularjs+bootstrap+Spring+mybatis实现的java web系统项目
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)
- 一个自己编写的象棋程序,可实现走棋谱(如炮二平五),工程完成度%96,跟大家分享一下,下一步要做残局,欢迎交流
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)
- 分享一个ToastUtil的工具满足大家在做项目的时候各种吐司的需求
- 一个项目中的STL类型的选择和算法实现
- 项目中分享功能的实现-----------一个小的记录
- JavaScript实现的一个计算数字步数的算法分享
- 经验分享 | 一个互联网项目如何实现持续集成
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)
- 数据算法一个项目中的STL类型的选择和算法实现
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
- Python 最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表。 实现方式: 通过goog
- 分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室
- 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:前期需求调查部分)
- <p>在我们的实际软件项目中,管理团队事实上比写代码或者实现一个客户的需求更为的有挑战性。由于编程实际上是和机器打交道,而和机器打交道,仅仅要你符合机器预定的逻辑,</p>
- 本文实例讲述了AngularJS+bootstrap实现动态选择商品功能。分享给大家供大家参考,具体如下: 项目中后台一个商品库,新建活动时动态选择所需商品