算法题(十七):搜狐19年校招编程题(一、三)——兄弟字符、版本号比较

兄弟字符:只通过了71.4%,难道漏了什么情况?知道的还望讨论补充。

问题:类似“abc”,"acb","cba"这样的调换两个字符顺序的字符串称为兄弟字符串,现输入两个字符串,判断是否为兄弟字符串,是则输出1,否则输出0。

输入输出示例:

示例一:

ab ba

1

示例二:

aa aa

1

示例三:

ab ab

0

分析:字符串处理问题。1)先比较两个字符串长度是否相同,长度是否为1,不同或长度为1的返回0。2)是否能找到不同的字母,找不到且长度不为1的返回1,找到了但数目不为2返回0(为0的是特殊情况),找到了且数目等于2则进入下一个判断。3)如果数目为0,若字符串类似“aa”这样由一个字母组成的,则返回1。4)找到2个不同的字母后,交换两个字母的位置,看两个字符串是否相同,相同返回1。

代码:

import java.util.ArrayList;

public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String strA = "aa";
		String strB = "aa";
		int lenA = strA.length();
		int lenB = strB.length();
		if(lenA != lenB || lenA == 1){
			System.out.println(0);
			return;
		}
		int count = 0;//用来计不同字母的数量
		char start = strA.charAt(0);//A的首个字母,用于比较A是否为全由同一个字母组成
		int count2 = 0;//记录A中与A首字母相同的字母个数,用于比较A是否为全由同一个字母组成
		ArrayList<Integer> list = new ArrayList<>();//用来保存不同字母的位置
		for(int i=0; i<lenA; i++){
			if(strA.charAt(i) != strB.charAt(i)){
				count++;
				list.add(i);
			}
			if(strA.charAt(i) == start){
				count2++;
			}
		}
		if(count == 0 && count2 == lenA){
			System.out.println(1);
			return;
		}else if(count != 2){
			System.out.println(0);
			return;
		}
		char b1 = strB.charAt(list.get(0));
		char b2 = strB.charAt(list.get(1));
		String strC = "";
		for(int i=0; i<lenA; i++){
			if(i == list.get(0)){
				strC += b2;
			}else if(i == list.get(1)){
				strC += b1;
			}else{
				strC += strB.charAt(i);
			}
		}
		if(strA.equals(strC)){
			System.out.println(1);
		}else{
			System.out.println(0);
		}
	}

}

版本号比较:已AC

问题:比较两个字符串所代表的版本号的大小,若A比B大,则输出1,相等输出0,小则输出-1。

输入输出示例:

示例一:

"7.2.3" "7.2.4"

1

示例二:

"7.0" "7.0.1"

-1

示例三:

"7.0" "7"

0

分析:字符串处理问题。和上题一样,要考虑全面才能全部通过。1.先遍历AB中长度相同的部分,A大于B,输出1,A小于B输出-1,A等于B,记录个数;2)若A等于B的个数与A的长度、B的长度都相等,则同输出0;3)若A的长度大于B,则A中剩下的只要有不为0的数,则输出1,否则输出0;4)若B的长度大于A,则B中剩下的只要有不为0的数,则输出-1,否则输出0。

代码:


public class Main{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String strA = "7.0.2";
		String strB = "7.0.2";
		strA = strA.replace(".", ",");
		strB = strB.replace(".", ",");
		String[] numA = strA.split(",");
		String[] numB = strB.split(",");
		int lenA = numA.length;
		int lenB = numB.length;
		int len = lenA>lenB? lenB : lenA;
		int count = 0;
		for(int i=0; i<len; i++){
			int tempA = Integer.parseInt(numA[i]);
			int tempB = Integer.parseInt(numB[i]);
			if(tempA > tempB){
				System.out.println(1);
				return;
			}else if(tempA < tempB){
				System.out.println(-1);
				return;
			}else{
				count++;
			}
		}
		if(count == lenA && count == lenB){
			System.out.println(0);
			return;
		}
		if(lenA > lenB){
			int res = 0;
			for(int i = count; i<lenA; i++){
				if(!numA[i].equals("0")){
					res = 1;
				}
			}
			System.out.println(res);
		}else if(lenA <= lenB){
			int res = 0;
			for(int i = count; i<lenB; i++){
				if(!numB[i].equals("0")){
					res = -1;
				}
			}
			System.out.println(-1);
		}
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值