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秒