Array And String(数组和字符串)

Posted struggleforit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Array And String(数组和字符串)相关的知识,希望对你有一定的参考价值。

1.实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该怎么处理?

技术分享
public class UniqueChars {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "abcdefgfedcba";
        System.out.print(isUniqueChars(string));
            
    }
    public static boolean isUniqueChars(String str) {
        if (str.length() > 256) {
            return false;
        }
        boolean[] char_set = new boolean[256];
        for (int i = 0; i < str.length(); i++) {
            int val = str.charAt(i);
            if (char_set[val]) {
                return false;
            }
            char_set[val] = true;
        }
        return true;
    }

}
View Code

注意:向面试官确认上面的字符串是ASCII字符串还是Unicode字符串。若不是ASCII字符串需扩大存储空间,但其余逻辑不变。

          这里假定是ASCII字符串。首先做一个优化,若字符串长度大于字母表中的字符个数,就直接返回false。毕竟,若字母表只有256个字符,字符串里就不可能有280个各不相同的字符。

           然后构建一个布尔值的数组,索引值i对应的标记指示该字符串是否含有字母表第i个字符。若这个字符第二次出现,则立即返回false。时间复杂度o(n),空间复杂度o(1)。

若不允许使用额外的数据结构:

(1)将字符串中的每一个字符与其余字符进行比较。时间复杂度为o(n2),空间复杂度o(1)。

技术分享
public class UniqueChars {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "abcdefgfedcba";
        System.out.print(isUniqueChars(string));
            
    }
   
    public static boolean isUniqueChars(String str) {
        if (str.length() > 256) {
            return false;
        }
        for(int i = 0; i < str.length(); i++) {
            for(int j = i + 1; j < str.length(); j++) {
                if(str.charAt(i) == str.charAt(j)) return false;
            }
        }
        return true;
    }
}
View Code

(2)若允许修改输入字符串,可以在o(nlogn)的时间里对字符串排序,然后线性检查其中有无相邻字符完全相同的情况。

2.用Java实现void reverse(char* str)函数,即反转一个null结尾的字符串。

技术分享
package ArrayAndString;

public class Reverse {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string = "abcdefg";
        System.out.println(reverseString2(string));
    }
    //最简单的方法
    public static String reverseString(String iniString) {
        // write code here
        StringBuffer tmp = new StringBuffer(iniString);
        tmp = tmp.reverse();
        return tmp.toString();
    }
    //最常用的方法
    public static String reverseString2(String iniString) { 
         char[] array = iniString.toCharArray(); 
         String reverse = "";  //注意这是空串,不是null
         for (int i = array.length - 1; i >= 0; i--) { 
             reverse += array[i];
         }
         return reverse; 
     } 

}
View Code

3.给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

解法一:对字符串排序后进行比较,若它们拥有相同顺序的字符,即互为变位词。

技术分享
import java.util.*;

public class IsAnagram {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string1 = "aceg";
        String string2 = "cega";
        System.out.println(permutation(string1, string2));    
    }
    
    public static String sort(String s) {
        char[] content = s.toCharArray();
        Arrays.sort(content);
        return new String(content);
    }
    
    public static boolean permutation(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        return sort(s).equals(sort(t));
    }

}
View Code

解法二:利用变位词的定义--组成两个单词的字符数相同,遍历字母表,计算每个字符出现的次数,然后比较这两个数组。

技术分享
public class IsAnagram {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String string1 = "aceg";
        String string2 = "cega";
        System.out.println(permutation(string1, string2));    
    }
    public static boolean permutation(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        
        int[] letters = new int[256];
        char[] s_array = s.toCharArray();
        for (char c : s_array) {
            letters[c]++;
        }
        for (int i = 0; i < t.length(); i++) {
            int c = (int) t.charAt(i);
            if (--letters[c] < 0) {
                return false;
            }
        }
        return true;
    }

}
View Code

注意:向面试官确认 变位词是否区分大小写 以及 是否要考虑空白字符。

          这里假定变位词比较区分大小写,空白也要考虑在内,是ASCII字符串。首先做一个优化,比较两个字符串的长度,只要长度不同就不可能是变位词。

4.编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)

思路:进行两次扫描。第一次扫描先数出字符串种有多少空格,从而算出最终的字符串有多长。第二次扫描真正开始反向编辑字符串,检测到空格则将%20复制到下一个位置,若不是空白,就复制原先的字符。

注意:处理字符串操作问题时,常见做法是从字符串尾部开始编辑,从后往前反向操作。因为字符串尾部有额外的缓冲,可以直接修改,不必担心会复写原有数据。

          

 

以上是关于Array And String(数组和字符串)的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.4+vue.jslaravel 循环三维数组,解决:htmlentities() expects parameter 1 to be string, array given(示例(代

LeetCode11.Array and String —Array Partition I 数组分区

Java中求字符串String和数组Array的长度(length)

sqli-labs less25 GET- Error based -All you OR&AND belong to us -string single quote(基于错误的去除了or(代

String&Array字符串|数组练习

String&Array字符串|数组练习