程序员面试金典1.2,1.3

程序员面试金典1.2

程序员面试金典1.2,1.3_第1张图片

文章目录

  • 程序员面试金典1.2
    • 哈希表
    • 排序
    • 异或运算(失败)
  • 程序员面试金典1.3
    • StringBuilder暴力
    • 转换为charArray

哈希表

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length() != s2.length()) return false;
        HashMap<Character,Integer>map1=new HashMap<>();
        for(int i=0;i<s1.length();i++)
        {
            map1.put(s1.charAt(i),map1.getOrDefault(s1.charAt(i),0)+1);
        }
        for(int i=0;i<s2.length();i++)
        {
            map1.put(s2.charAt(i),map1.getOrDefault(s2.charAt(i),0)-1);
        }
        for(int val:map1.values())
        {
            if(val!=0)  return false;
        }
        return true;
    }
}

注意HashMap里的getOrDefault函数和values函数

排序

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length() != s2.length()) return false;
        char[] array1=s1.toCharArray();
        char[] array2=s2.toCharArray();
        Arrays.sort(array1);
        Arrays.sort(array2);
        return Arrays.equals(array1,array2);
        //注意equals的用法
    }
}

注意排序是用的Arrays.sort()
而且也可以用Arrays来比较两个数组是否相等

异或运算(失败)

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        //base case
        if(null==s1 || null==s2 || s1.length()!=s2.length()) return false;

        // 只使用 异或运算(位运算)会出现(aa bb )这种情况
        // 只使用 ASII码值或出现(ac bb )这种情况
        int n =0;
        int sum1=0;
        int sum2=0;
        
        char[] chs1=s1.toCharArray();
        char[] chs2=s2.toCharArray();

        for(int i=0;i<chs1.length;i++){
            sum1+=chs1[i];
            sum2+=chs2[i];
            n^=chs1[i];
            n^=chs2[i];
        }

       return n==0&&sum1==sum2;

    }
}

注意不只要用到异或,还要用ASCII码
但是后序发现
程序员面试金典1.2,1.3_第2张图片
显然异或还是不行,玩魔怔了。

程序员面试金典1.3

程序员面试金典1.2,1.3_第3张图片

StringBuilder暴力

class Solution {
    public String replaceSpaces(String S, int length) {
        StringBuilder str1=new StringBuilder();
        for(int i=0;i<length;i++)
        {
            char ch=S.charAt(i);
            if(ch !=' '){
                str1.append(ch);
            }
            else{
                str1.append("%20");
            }
        }
        return str1.toString();

    }
}

stringBuilder单线程的增加字母的开销应该是要比string小
当然这个题的本质就是下面这个函数

class Solution {
    public String replaceSpaces(String S, int length) {
        return S.substring(0,length).replaceAll(" ","%20");

    }
}

注意一下substring(a,b)
是截取a到b-1的下标的。

    String test = "Hello World !";
    String subTest1 = test.substring(0,3);

运行结果如下:
subTest:Hel

转换为charArray

假定该字符串尾部有足够的空间存放新增字符,基于题干的这个条件。
这种肯定是从后向前。

class Solution {
    public String replaceSpaces(String S, int length) {
       char[] array1=S.toCharArray();
       int len=S.length()-1;  //这里忘记减一,错了一次
       for(int i=length-1;i>=0;i--){
           if(array1[i]==' '){
               array1[len--]='0';
               array1[len--]='2';
               array1[len--]='%';
           }
           else{
               array1[len--]=array1[i];
           }

       }
       return new String(array1,len+1,S.length()-1-(len+1)+1); //数组,起始,长度

    }
}

你可能感兴趣的:(程序员面试金典Java,算法,java)