某机构的机构代码按照以下方式设置:
如机构A=1000000000
则其下级机构表示为10??000000,??表示两位非零数字,以此类推。
例如:如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,相反,105003010000则表示其下级的下级。现在给出两个字符串,要求验证其是否直接上下级关系。String s1 = "1008000000";
String s2 = "1008010000";
判断s2是否s1的下级要求写出最优算法
如机构A=1000000000
则其下级机构表示为10??000000,??表示两位非零数字,以此类推。
例如:如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,相反,105003010000则表示其下级的下级。现在给出两个字符串,要求验证其是否直接上下级关系。String s1 = "1008000000";
String s2 = "1008010000";
判断s2是否s1的下级要求写出最优算法
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;
}
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));
}
}
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));
}}
String s2 = "10110101111111111111";
结果: s2 也是s1的直接下级对于题目还有以下疑问,"如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,"
怎么确定 1050100000,1059900000(是) 不是他的下级?也就是怎么标志头部
首先s1和S2的长度是相等的;
第二,判断s1的直接下级:就是在去掉s1的所有尾部0之后,在后面添加任意两位的数字01~99,后面的剩余位再用0补齐,得到的字符串就是s1的直接下级
s1 = "10500000000" -> "1050" -> "105001"..."105099" -> "1050010000"..."1050990000"
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);
}
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");
}