编程算法基础-一刀切法

16 篇文章 0 订阅

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秒


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值