寻最优算法:关于项目中机构代码上下级判断的问题

tttk 2008-03-12 09:27:45
某机构的机构代码按照以下方式设置:
如机构A=1000000000
则其下级机构表示为10??000000,??表示两位非零数字,以此类推。
例如:如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,相反,105003010000则表示其下级的下级。

现在给出两个字符串,要求验证其是否直接上下级关系。

String s1 = "1008000000";
String s2 = "1008010000";
判断s2是否s1的下级

要求写出最优算法
...全文
297 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaaa6794 2008-03-13
  • 打赏
  • 举报
回复
假如直属级别,两个字符串中只有两位字符不相等,
String s1 = "1008000000";
String s2 = "1008010100";
Pattern pa=Pattern.compile("\\d{2}");
Matcher ma1 = pa.matcher(s1);
Matcher ma2 = pa.matcher(s2);
int isLevel=0;
for(int i=0;i<s1.length()/2;i++){
ma1.find();
ma2.find();
System.out.print(ma1.group()+"=");
System.out.println(ma2.group());
if(!(ma1.group()).equals((ma2.group()))){
isLevel++;
}
}
if(isLevel==1){
System.out.println("inser into");
}

aaaaa6794 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 tttk 的回复:]
解释楼上的:
首先s1和S2的长度是相等的;
第二,判断s1的直接下级:就是在去掉s1的所有尾部0之后,在后面添加任意两位的数字01~99,后面的剩余位再用0补齐,得到的字符串就是s1的直接下级
s1 = "10500000000" -> "1050" -> "105001"..."105099" -> "1050010000"..."1050990000"
[/Quote]

两个字符串要是直属级别了,是不是就两位不相等?
tttk 2008-03-13
  • 打赏
  • 举报
回复
楼上的这个办法挺酷的!COOL
tttk 2008-03-12
  • 打赏
  • 举报
回复
回复8楼:数据库中已经设计了父代码字段。
写上面的代码主要是考虑在大批量数据处理的业务逻辑中,这样可以避免数据库的频繁查询。
tttk 2008-03-12
  • 打赏
  • 举报
回复
上面的算法需要更正:

public class AllTest extends TestCase {

private boolean isSubCode(String s1, String s2, int numSpan) {
int k = 0; // 表示s1中非0值出现的个数
for (int i = 0; i < s1.length(); i++) {
if (i % numSpan == 0) k = 0;
if (s1.charAt(i) != '0') k++;

if (s1.charAt(i) == s2.charAt(i)) continue;

if (k > 0) return false;
for (int j = i + (numSpan - i % numSpan); j < s1.length(); j++) {
if (s2.charAt(j) != '0') return false;
}

return true;
}

return false;
}

public void testAll() throws Exception {
String s1 = "10110100";
String s2 = "10110101";

assertTrue(isSubCode(s1, s2, 2));
}

}
yz_ivan 2008-03-12
  • 打赏
  • 举报
回复
说句题外话,虽然客户是通过机构代码的编码格式描述上下级的,但是系统中最好通过增加一个父级机构的字段去描述这种关系。
tttk 2008-03-12
  • 打赏
  • 举报
回复
我写了一个算法,测试通过。

package test;

import junit.framework.TestCase;

public class AllTest extends TestCase {

private boolean isSubCode(String s1, String s2, int numSpan) {
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) == s2.charAt(i)) continue;

if (s1.charAt(i) != '0') return false;
for (int j = i + (numSpan - i % numSpan); j < s1.length(); j++) {
if (s2.charAt(j) != '0') return false;
}

return true;
}

return true;
}

public void testDate() throws Exception {
String s1 = "1005000000";
String s2 = "1005110000";

assertTrue(isSubCode(s1, s2, 2));
}
}
nihuajie05 2008-03-12
  • 打赏
  • 举报
回复
同楼上,等正则
OnlyLikeJava 2008-03-12
  • 打赏
  • 举报
回复
不知道你上下级的代码长度是否一样!如果一样的话你可以试试我这方法。
public boolean judge(String s1, String s2) {
int point = 0;
for (int i = 0; i < s1.length(); i++) {
try {
String sub1 = s1.substring(i, i + 1);
String sub2 = s2.substring(i, i + 1);
if (!sub1.equals(sub2)) {
point = i + 1;
break;
}
} catch (Exception e) {

}
}
String result = s2.substring(point, point + 2);
if (!result.equals("00")) {
return false;
}
return true;
}
cb1156 2008-03-12
  • 打赏
  • 举报
回复
看有没有 正则表达式的牛人
用正则应该是最优的
tttk 2008-03-12
  • 打赏
  • 举报
回复
其实有很多种算法,我只是想寻找一种最优的。之所以如此,是因为用户要求在插入大批量数据之前对插入数据进行数据校验,要插入的记录中的机构代码字段必须是当前用户的直接下级机构,否则不能插入数据库。
tttk 2008-03-12
  • 打赏
  • 举报
回复
补充:要求判断s2是否s1的直接下级
tttk 2008-03-12
  • 打赏
  • 举报
回复
注:机构代码中每两位表示一个级差,机构代码的位数必然为偶数。
Java_Tang 2008-03-12
  • 打赏
  • 举报
回复
补充说明:i 代表两机构之间的级数,如果为1则为上下级。
Java_Tang 2008-03-12
  • 打赏
  • 举报
回复
仅供参考:

public static void main(String args[]){
String str1="1008000000";
String str2="1008010200";

str1=str1.replaceAll("00", "");
str2=str2.replaceAll("00", "");

int numSpan=2; //
int i=(str2.length()-str1.length())/numSpan;

System.err.println(str1);
System.err.println(str2);
System.err.println(i);
}
jianghuxiaoxiami 2008-03-12
  • 打赏
  • 举报
回复
就是在去掉s1的所有尾部0之后,在后面添加任意两位的数字01~99

s1 = "10500000000" -> "105" -> ...
tttk 2008-03-12
  • 打赏
  • 举报
回复
解释楼上的:
首先s1和S2的长度是相等的;
第二,判断s1的直接下级:就是在去掉s1的所有尾部0之后,在后面添加任意两位的数字01~99,后面的剩余位再用0补齐,得到的字符串就是s1的直接下级
s1 = "10500000000" -> "1050" -> "105001"..."105099" -> "1050010000"..."1050990000"
jianghuxiaoxiami 2008-03-12
  • 打赏
  • 举报
回复
若按9楼的程序, String s1 = "10110100";
String s2 = "10110101111111111111";
结果: s2 也是s1的直接下级

对于题目还有以下疑问,

"如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,"
怎么确定 1050100000,1059900000(是) 不是他的下级?也就是怎么标志头部

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧