编程算法基础-一刀切法
1.5一刀切法
编程和编筐一样,处理边缘问题相同重要。
程序逻辑
開始
中间
结束
一刀切法上式
用空格或逗号分隔的串,提取为各个部分
abc ttt,kmd,uuu xyz
切分成每一部分。
/* * "abc ttt,kmd,uuu xyz" 用逗号或者空格隔开字符串 分解为各个部分 */ package OneCut; public class SplitString { public static void main(String[] args) { // 一刀切(上式:事先补齐法) String s = "abc ttt,kmd,uuu xyz"; String s2 = ""; s+=',';//一刀切,补齐 for(int i=0;i<s.length();i++){ char c = s.charAt(i); if(c==' '||c==','){ System.out.println(s2); s2=""; }else{ s2+=c; } } } }
abc ttt kmd uuu xyz
一刀切法上式:事先补齐
设法先修补一下,让边沿和中间的部分处理没有差别
一刀切法下式
事后修正
先作出统一的结果,再对结果进行修补
将一个串拆成字母,而且字母间用逗号切割
"abcd"à "a,b,c,d"
public class StringToLetter { /** * 将一个串拆成字母 * 而且字母间用逗号切割 * "abcd" "a,b,c,d" */ public static void main(String[] args) { // 一刀切(下式:事后修正法) String s = "abcdefg"; String s2 = ""; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i);// 取出每个字符赋值给c s2 += "," + c;// 将s2中增加逗号和c } s2 = s2.substring(1);// 取s2的字串,就能够避免开头是逗号的问题 System.out.println(s2); } } //当s为空时会报错
a,b,c,d,e,f,g
通话时间编程
如果手机通话时间不会大于24小时。
某个用户的開始通话时间为: 12:38:15
结束通话时间为: 12:39:16
则该用户通话时长为:62秒
对于一般的情况,可能须要考虑:跨分钟,跨小时,跨零点的问题。
假设已知了開始和结束时间,试编程求通话时长。
时间格式为:hh:mm:ss
小时採用24小时制
提示:关键在于怎样处理,能把貌似不同的特殊情况转化为一致的一般情况。
/* 如果手机通话时间不会大于24小时。 某个用户的開始通话时间为: 12:38:15 结束通话时间为: 12:39:16 则该用户通话时长为:62秒 对于一般的情况,可能须要考虑:跨分钟,跨小时,跨零点的问题。 如果已知了開始和结束时间,试编程求通话时长。 时间格式为:hh:mm:ss 小时採用24小时制 提示:关键在于怎样处理,能把貌似不同的特殊情况转化为一致的一般情况。 */ package OneCut; import java.util.ArrayList; import java.util.List; public class PhoneTime { public static void main(String[] args) { String s1 = "23:38:16"; String s2 = "0:28:16"; int hour; if (Integer.valueOf(mySplit(s2).get(0)) < Integer.valueOf(mySplit(s1) .get(0))) { hour = 24 + Integer.valueOf(mySplit(s2).get(0)) - Integer.valueOf(mySplit(s1).get(0));// 跨零点时+24 } else { hour = Integer.valueOf(mySplit(s2).get(0)) - Integer.valueOf(mySplit(s1).get(0)); } int min = Integer.valueOf(mySplit(s2).get(1)) - Integer.valueOf(mySplit(s1).get(1)); int sec = Integer.valueOf(mySplit(s2).get(2)) - Integer.valueOf(mySplit(s1).get(2)) + 1; int time = hour * 60 * 60 + min * 60 + sec; System.out.println("通话时间长度为:"+time+"s"); } public static List<String> mySplit(String s) { List<String> list = new ArrayList<String>();//建立List存放时间 String t = "";//暂时字符串 s += ":";//一刀切上式 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == ':') { list.add(t);//增加到list t = ""; } else { t += c; } } return list; } }
通话时间长度为:3001s
改动一下时间格式
/* 如果手机通话时间不会大于24小时。 某个用户的開始通话时间为: 12:38:15 结束通话时间为: 12:39:16 则该用户通话时长为:62秒 对于一般的情况,可能须要考虑:跨分钟,跨小时,跨零点的问题。 如果已知了開始和结束时间,试编程求通话时长。 时间格式为:hh:mm:ss 小时採用24小时制 提示:关键在于怎样处理,能把貌似不同的特殊情况转化为一致的一般情况。 */ package OneCut; import java.util.ArrayList; import java.util.List; public class PhoneTime { public static void main(String[] args) { String s1 = "23:38:16"; String s2 = "23:39:6"; int hour; if (Integer.valueOf(mySplit(s2).get(0)) < Integer.valueOf(mySplit(s1) .get(0))) { hour = 24 + Integer.valueOf(mySplit(s2).get(0)) - Integer.valueOf(mySplit(s1).get(0));// 跨零点时+24 } else { hour = Integer.valueOf(mySplit(s2).get(0)) - Integer.valueOf(mySplit(s1).get(0)); } int min = Integer.valueOf(mySplit(s2).get(1)) - Integer.valueOf(mySplit(s1).get(1)); int sec = Integer.valueOf(mySplit(s2).get(2)) - Integer.valueOf(mySplit(s1).get(2)) + 1; int time = hour * 60 * 60 + min * 60 + sec; System.out.println("通话时间长度为:"+time+"s"); //为了显示的更好看,做例如以下改动。 String ans = null; if(sec>0){ ans = sec+"秒"; } if(min>0){ if(sec<0){ int min2=min-1;//这里min为负值 int sec2 = 1*60+sec; ans = min2+"分"+sec2+"秒"; }else{ ans=min+"分"+sec+"秒"; } } if(hour>0){ if(min<0){ if(sec<0){ int hour2=hour-1; int min2=1*60+min-1;//这里min为负值 int sec2 = 1*60+sec; ans = hour2+"小时"+min2+"分"+sec2+"秒"; }else{ int hour2=hour-1; int min2=1*60+min;//这里min为负值 ans = hour2+"小时"+min2+"分"+sec+"秒"; } }else{ ans=hour+"小时"+min+"分"+sec+"秒"; } } System.out.println(ans); } public static List<String> mySplit(String s) { List<String> list = new ArrayList<String>();//建立List存放时间 String t = "";//暂时字符串 s += ":";//一刀切上式 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == ':') { list.add(t);//增加到list t = ""; } else { t += c; } } return list; } }
通话时间长度为:51s 0分51秒