• 《程序员面试金典》部分题解


    1.1

     1 import java.util.Scanner;
     2 public class Main 
     3 {
     4     //此方法时间复杂度为O(n) 空间复杂度为O(1)
     5     public static boolean isUniqueChar2(String str)
     6     {
     7         //若字符串长度大于字母表中字符个数,则必有重复
     8         if(str.length()>256)    return false;
     9         boolean[] char_set = new boolean[256];    //默认都是false
    10         for(int i=0; i<str.length(); i++)
    11         {
    12             int val = str.charAt(i);
    13             //若这个字符已出现过,则返回false
    14             if(char_set[val])    return false;
    15             char_set[val] = true;
    16         }
    17         return true;
    18     }
    19     public static void main(String[] args) {
    20         String str;
    21         Scanner sca = new Scanner(System.in);
    22         //多组输入,输入#结束
    23         while(true)
    24         {
    25             str = sca.nextLine();
    26             if(str.equals("#"))    return;
    27             boolean res = isUniqueChar2(str);
    28             System.out.println(res);
    29         }
    30     }
    31 }

    1.2

    #include <iostream>
    #include <cstring>
    using namespace std;
    void reverse(char* str)
    {
      char* end = str;
      char tmp;
      //找出字符串末尾
      while(*end)
      {
        end++;
      }
      end--;//会退到null前的一个字符
      while(str < end)
      {
        tmp = *str;
        *str = *end;
        *end = tmp;
        str++;
        end--;
      }
    }
    int main()
    {
        char s[100];
        cin>>s;
        reverse(s);
        cout<<s;
        return 0;
    }

    1.3

    import java.util.Arrays;
    import java.util.Scanner;
    
    public class SortC {
        public static String sort(String s)
        {
            char[] con = s.toCharArray();
            Arrays.sort(con);
            return new String(con);
        }
        public static boolean permutation(String s, String t)
        {
            if(s.length() != t.length())    return false;
            return sort(s).equals(sort(t));
        }
        public static void main(String[] args) {
            String s, t;
            Scanner sca = new Scanner(System.in);
            while(true)
            {
                s = sca.nextLine();
                if(s.equals("#"))
                    return;
                t = sca.nextLine();
                System.out.println(permutation(s, t));
            }
        }
    
    }

    1.4

    这题主要是一开始开的数组要足够大,不然会有数组越界的错误。

     1 public class Main {
     2     public static void main(String[] args) {
     3         String string = "Mr John Smith "; 
     4         char[] s = new char[100];
     5         int length = string.length();
     6         for(int i=0; i<length; i++){
     7             s[i] = string.charAt(i);
     8         }
     9         for (int i=length-1; i>=0; i--) {
    10             if(s[i] == ' ')    length--;
    11             else     break;
    12         }
    13         repSpace(s, length);
    14         System.out.println(s);
    15     }
    16     public static void repSpace(char[] s, int length) {
    17         int spaceNum=0, newLength;
    18         for(int i=0; i<length; i++){
    19             if(s[i] == ' ') spaceNum++;
    20         }
    21         newLength = length + spaceNum*2;
    22         s[newLength] = '';
    23         int j = newLength - 1;
    24         for(int i=length-1; i>=0; i--){
    25             if(s[i]!=' ')
    26                 s[j--] = s[i];    
    27             else {
    28                 s[j--]='0'; s[j--]='2'; s[j--]='%';
    29             }
    30         }
    31     }
    32 }

     1.5 这题主要是考察对StringBuffer的理解,在字符串拼接上比String效率高

     1 public class Main {
     2     public static void main(String[] args) {
     3         System.out.println(compressBad("aabcccccaaa"));
     4         System.out.println(compressBuffer("aabcccccaaa"));
     5     }
     6     //时间复杂度为O(str.length()+k^2)
     7     public static String compressBad(String str) {
     8         String mystr = "";
     9         char last_char = str.charAt(0);
    10         int count = 1;
    11         for(int i=1; i<str.length(); i++){
    12             if(str.charAt(i) == last_char)    count++;
    13             //如果这个字符与之前不同
    14             else {
    15                 //字符串拼接的时间杂度为O(n^2)
    16                 mystr+=(last_char+""+count);
    17                 last_char = str.charAt(i);
    18                 count=1;
    19             }
    20         }
    21         mystr+=(last_char+""+count);
    22         if(mystr.length()>=str.length())    return str;
    23         else    return mystr;
    24     }
    25     //利用StringBuffer来减少时间复杂度
    26     public static String compressBuffer(String str) {
    27         StringBuffer mystr = new StringBuffer();
    28         char last_char = str.charAt(0);
    29         int count = 1;
    30         for(int i=1; i<str.length(); i++){
    31             if(str.charAt(i) == last_char)    count++;
    32             //如果这个字符与之前不同
    33             else {
    34                 //字符串拼接会直接构建一个新串,因此时间杂度为O(n^2)
    35                 mystr.append(last_char);
    36                 mystr.append(count);
    37                 last_char = str.charAt(i);
    38                 count = 1;
    39             }
    40         }
    41         mystr.append(last_char);
    42         mystr.append(count);
    43         if(mystr.length()>=str.length())    return str;
    44         else    return mystr.toString();
    45     }
    46 }
  • 相关阅读:
    【BZOJ4915】简单的数字题(数学)
    【BZOJ2140】稳定婚姻(匈牙利算法板子题)
    【BZOJ2739】最远点(决策单调性)
    【AT3526】[ARC082C] ConvexScore(贡献转化+容斥)
    【CF1264D2】Beautiful Bracket Sequence(组合数学)
    【洛谷2561】[AHOI2002] 黑白瓷砖(Polya定理)
    【洛谷3511】[POI2010] MOS-Bridges(混合图欧拉回路)
    【洛谷4226】避难所(构造)
    【洛谷7453】[THUSCH2017] 大魔法师(线段树+矩乘)
    【洛谷3207】[HNOI2010] 物品调度(置换问题)
  • 原文地址:https://www.cnblogs.com/mycd/p/5605017.html
Copyright © 2020-2023  润新知