编程算法基础-一刀切法

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秒



编程算法基础-一刀切法

时间: 2024-10-24 19:45:34

编程算法基础-一刀切法的相关文章

编程算法基础-2.7作业-通讯编码-格式检查

作业 通信编码 如果通信的物理设备仅仅能表示1和0两种状态. 1和0状态都不能持续太久,否则物理设备会出现问题.因而人们设计出一种变通的方法: 多个0后人为地补入一个1 多个1后人为地补入一个0 当然,在解码的时候,要对应处理. 以下我们用串来模拟这个算法. 如果有须要通信的串: String s = "1010100100100001011110100010101010100001010101111"; 连续的3个0,后须要插入一个1 连续的3个1,后须要输入一个0 10101001

编程算法基础3.3-测试驱动风格

cocos2d-x升级到3.0后变化不小,除了API的变化(主要是函数和类名称变化,以及使用了C++11的不少特性,function/bind, lamda, std::thread-),创建和编译工程也做了一些简化调整.本文主要讨论一下cocos2d-x3.0 在android平台开发的环境设置及工程创建编译流程. 1.   初始设置 除了2.x所需要的python,jdk, android sdk和ndk之外,还需要部署apache-ant. 1)      在path中设置好java环境变

编程算法基础-2.3进制转换

2.3进制转换 使用int存一个整数时.内存中是用二进制存储的,当要显示的时候.用十进制显示. 随意进制间的转换 n进制转m进制 String s = "2001201102" 3进制转换为5进制 先转换为2进制.再转换为5进制 /* 随意进制间的转换 n进制转m进制 String s = "2001201102" 3进制转换为5进制 先转换为10进制,再转换为5进制 */ package BinaryTrans; public class NToM { publi

编程算法基础-暴力破解法

1.1   暴力破解法 鸡兔同笼 50头,120脚,鸡兔分别几仅仅? /*鸡兔同笼 * 鸡兔同笼,头50,脚120 * 鸡兔几何? */ package ChickRabbit; public class ChickRabbit { public static void main(String[] args){ int chick; int rabbit; int HEAD=50; int FEET=120; for(chick=0;chick<=HEAD;chick++){ rabbit=HE

编程算法基础-3.2自底向上风格

3.2自底向上风格 自顶向下不是万能的 需求发生变化时,会很尴尬 变化是需求的本质特征 内部或外界的环境一旦发生小小的变化,就会造成很大的变动 个人---完全掌控----->简单的软件逻辑<-----完全计划的模式 小组协作---掌控变化---->庞大的软件规模---产生-->自适应变化<-----解决-----主流解决方案:面向对象 面向对象正是采用自底向上的设计风格 打印控制台表格2 实际开发中,使用混合风格,根据项目的要求而定 需求:不变,变 不变--->多种风格

编程算法基础-3.1自顶向下风格

第三讲 风格与模式 3.1自顶向下风格 复杂问题分解,直到小问题足够简单,能够掌控为止 是一种思考方式 把大的任务不断的分解为更小的子任务 还有一法宝:忽略,忽略细节 程序问题 制定框架--->逐步细化--->逐步精华--->分解为子问题 打印特定的形状 做一个二维数组的缓冲区 向缓冲区输出 缓冲区输出屏幕上 数组初始元素都是0 表格:横线.竖线. /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $

十大编程算法助程序员走上大神之路

概述:编程算法,是完成程序逻辑的主要途径.本文推荐十大编程算法,有利于程序员的编程逻辑. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(lis

高并发编程必备基础 -- 转载自 并发编程网

文章转载自 并发编程网  本文链接地址:高并发编程必备基础 一. 前言 借用Java并发编程实践中的话"编写正确的程序并不容易,而编写正常的并发程序就更难了",相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的,本文算是对多线程情况下同步策略的一个简单介绍. 二. 什么是线程安全问题 线程安全问题是指当多个线程同时读写一个状态变量,并且没有任何同步措施时候,导致脏数据或者其他不可预见的结果的问题.Java中首

转发---十大编程算法助程序员走上大神之路

十大编程算法助程序员走上大神之路 本文为转发,源地址:http://linux.cn/article-3613-1.html 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and co