《算法很美》第五章

1.判断字符串有无重复字符

public static boolean checkDifferent(String iniString) {
		if (iniString.isEmpty()) {
			return true;
		}
		int[] flag=new int[128];
		//扫描字符串
		for (int i = 0; i < iniString.length(); i++) {
			int c=(int)(iniString.charAt(i));
			if (flag[c]>0) return false;
			else flag[c]++;
		}
		return true;
	}

2.翻转字符串

//方法一:
	public String reverseString(String iniString) {
		int len=iniString.length();
		char[] charArr=new char[len];
		for (int i = 0; i < len; i++) {
			charArr[i]=iniString.charAt(len-1-i);
		}
		return new String(charArr);
	}

//方法二(简便):
	public String reverseString(String iniString) {
		StringBuilder sb=new StringBuilder(iniString);
		return sb.reverse().toString();
	}

3.变形词问题

	/**
	变形词:两个串有相同的字符及数量组成 abc abc ,abc cba,aabcd bcada;
	给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
	 * 这里规定大小写为不同字符,且考虑字符串中的空格。
	给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。
	保证两串的长度都小于等于5000。
	测试样例:
	"Here you are","Are you here"
	返回:false*/
	
	public boolean checkSam(String stringA,String stringB)
	{
		int len1=stringA.length();
		int len2=stringB.length();
		if (len1!=len2) {
			return false;
		}
		//转成字符数组
		char[] arr1=stringA.toCharArray();
		char[] arr2=stringB.toCharArray();
		//对它们排序
		Arrays.sort(arr1);
		Arrays.sort(arr2);
		return Arrays.equals(arr1, arr2);
	}

4.替换字符串中的空格

	/**
	 请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,
	 并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。
	 给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。
	 测试样例:
	 "Mr John Smith”,13
	 返回:"Mr%20John%20Smith"
	 ”Hello  World”,12
	 返回:”Hello%20%20World”
	 */
	 
	 //方法一:(简单)
	 	public static String replaceSpace(String iniString,int length) {
		return iniString.replaceAll("\\s", "%20");//"\\s"表示空格
	}
	//方法二;
	public static String replaceSpace(char[] iniString,int length) {
		int count=length;
		for (int i = 0; i < length; i++) {
			if (iniString[i]==' ') {
				count+=2;
			}
		}
		int p1=length-1;
		int p2=count-1;
		while (p1>=0) {
			if (iniString[p1]==' ') {
				iniString[p2--]='0';
				iniString[p2--]='2';
				iniString[p2--]='%';
				
			}else {
				iniString[p2--]=iniString[p1];
			}
			p1--;
		}
		return new String(iniString,0,count);
	}

5.字符串压缩

/**
 * 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。
 *  比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。
 * 若压缩后的字符串没有变短,则返回原先的字符串。
 *  给定一个string iniString为待压缩的串(长度小于等于10000),
 * 保证串内字符均由大小写英文字母组成,返回一个string,
 * 为所求的压缩后或未变化的串。 测试样例 "aabcccccaaa" 返回:"a2b1c5a3"
 */
public class Demo11 {
	public static void main(String[] args) {
		String res=zipString("aaabbbbbcc");
		System.out.println(res);
	}

	private static String zipString(String src) {
		int count=0;//记录前一个字符的重复次数
		char last=0;//上一个字符
		StringBuilder sb=new StringBuilder();
		for (int i = 0; i < src.length(); i++) {
			char charAt=src.charAt(i);
			if (sb.length()==0) {//处理第一个字符
				sb.append(charAt);
				count++;
			}else {
				if (last==charAt) {//和上一个字符相同
					count++;
				}else {				//和上一个字符不同
					sb.append(count).append(charAt);
					count=1;//重置为1
				}
			}
			last=charAt;
		}
		//考虑最后一个字符的重复次数()
		if (count>=1) {
			sb.append(count);
		}
		//比较新字符串和原字符串
		if (sb.length()>=src.length()) {
			return src;
		}
		return sb.toString();
	}
}

6.判断两字符串的字符集是否相等


	/**
	 * 询问两个串是否由相同的字符集生成
	 */
	public static void main(String[] args) {
	    boolean res = check2("abcde", "deabccadcd");
	    System.out.println(res);
	}
	/**
	   * 限制串的组成的字符时ASCII
	   * @param s1
	   * @param s2
	   * @return
	   */
	  static boolean check(String s1, String s2) {
	    int[] help = new int[256];
	    //扫描s1
	    for (int i = 0; i < s1.length(); i++) {
	      char c = s1.charAt(i);
	      if (help[c] == 0)
	        help[c] = 1;
	    }
	    //扫描s2
	    for (int i = 0; i < s2.length(); i++) {
	      char c = s2.charAt(i);
	      if (help[c] == 0)
	        return false;
	    }
	    return true;
	  }
	  
	  static boolean check2(String s1,String s2) {
		Map<Character, Integer>map=new HashMap<>();
		//扫描s1
		for (int i = 0; i < s1.length(); i++) {
			char c=s1.charAt(i);
			if (map.get(c)==null) {
				map.put(c, 1);
			}
		}
		//扫描s2
		for (int i = 0; i < s2.length(); i++) {
			char c = s2.charAt(i);
			if (map.get(c) == null) {// 这说明c不在map的key列表中
				return false;
			}
		}
		return true;
	}

7.判断A串是否B串的旋转字符串

/**
 * 判断A串是否B串的旋转字符串 
 * defabd fabdde -- true
 * @author zhengwei
 */
public class Demo13 {
	public static boolean isRotate(String a,String b)
	{
		if (a.length()!=b.length()) {
			return false;
		}
		//b+b
		StringBuilder sb=new StringBuilder(b).append(b);
		//如果b包含了a即a是b的子字符串,说明是旋转字符串
		//abcda与cdaab-----》cdaabcdaab
		return sb.toString().contains(a);
	}
}

8.移除字符串中连续出现的K个0

/**
 * 移除字符串中连续出现的K个0
 *
 * 可以用扫描字符数组的解法,但是用正则表达式更为快捷
 */
public class Demo15 {
	static String remove(String iniString,int k)
	{
		String regexp="0{"+k+"}";
		return iniString.replaceAll(regexp, "");
	}
	public static void main(String[] args) {
		System.out.println(remove("abcd0000adfsa00000ddd", 3));
	}
}

9.神奇的回文字符串

/**
 * 回文字符串
 * @author zhengwei lastmodified 2017年7月25日
 *
 */
public class Case10_Palindrome {
  public boolean isPalindrome(String src) {

    if (StringUtils.isEmpty(src)) {
      return true;
    }
    //翻转后和自己相同---回文字符串
    return src.equals(new StringBuilder(src).reverse().toString());
  }

/**
遍历四位数的所有回文数
*/
  // 解法:ijji形式
  static void palindromeNumber() {
    for (int i = 1; i < 10; i++) {
      for (int j = 0; j < 10; j++) {
        System.out.println(i * 1000 + j * 100 + j * 10 + i);
      }
    }
  }

  public static void main(String[] args) {
    palindromeNumber();
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值