华为面试算法

一面算法:
 有一串类似右面的字符串,在字符串基础上调整,使*全部位于末尾,其他字符保持原来前后顺序,不能开辟新的空间,效率要高,String str=“dhdh*cbcb*xhx***dhdh*”。
思考半分钟,
“java中字符串是不可变的啊!”   
“不可变?”
“是啊,不能修改”
“那你就当成stringbuilder”
无语。。。半分钟后,写了个时间复杂度n方级别的算法。。。
“两重循环啊” 
“在原来基础上操作只能这样了”



package com.test;


public class Copy_2_of_TT {

	public static void main(String[] args) throws Exception {

		int testCount = 0;
		while (testCount++ < 100) {

			//随机构造待移动字符串
			int len = (int) (Math.random() * 50 + 80);
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < len; i++) {
				char ch = (char) (Math.random() > 0.6 ? 'a' + i / 5 : '*');
				sb.append(ch);

			}
			System.out.println(sb.toString());
			
			
			
			//
			char[] chs = sb.toString().toCharArray();

			//开始移动    依次检查每一个字符
			for (int i = 0; i < chs.length; i++) {
				char c = chs[i];
				if (c == '*') {//若当前字符是*
					for (int j = i + 1; j < chs.length; j++) {//从待检查位置下一个位置起,找第一个不是*的字符
						if (chs[j] != '*') {
							char t = chs[i];//找到后交换
							chs[i] = chs[j];
							chs[j] = t;
							break;

						}
					}
					//当然这里可以特殊处理一下,判断j是否等于chs.length,若相等,表示从待检查位置起,后面的全是*,所以没必要继续检查了,直接break出外层循环就可以了
				}

			}

			for (int i = 0; i < chs.length; i++) {
				System.out.print(chs[i]);
			}

			System.out.println("\n\n");

		}
	}

}

面试总结   
   面试时还问了些其他东西,没想到问的这么水,随便一个有点项目经验的就可以,让我推荐同学中做web的,有基础就行。。。华为怎么能要求这么低,蘑菇街面试时问的都是些很深入的问题,和安卓紧密相关的,华为怎么能。。。。。  [END]


你可能感兴趣的:(算法,面试,String,华为)