1. 在不使用 StringBuffer 的前提下,怎么反转一个字符串?解决方案
思路:将字符串转成字符数组,倒叙遍历,然后拼接成字符串。
public class StringReverseExample { public static void main(String args[]) { //quick wasy to reverse String in Java - Use StringBuffer String word = "HelloWorld"; String reverse = new StringBuffer(word).reverse().toString(); System.out.printf(" original String : %s , reversed String %s %n", word, reverse); //another quick to reverse String in Java - use StringBuilder word = "WakeUp"; reverse = new StringBuilder(word).reverse().toString(); System.out.printf(" original String : %s , reversed String %s %n", word, reverse); //one way to reverse String without using StringBuffer or StringBuilder is writing //own utility method word = "Band"; reverse = reverse(word); System.out.printf(" original String : %s , reversed String %s %n", word, reverse); } public static String reverse(String source) { if (source == null || source.isEmpty()) { return source; } String reverse = ""; for (int i = source.length() - 1; i >= 0; i--) { reverse = reverse + source.charAt(i); } return reverse; } }
2. Java 中,怎么获取一个文件中单词出现的最高频率?解决方案
思路:将文本中的字符分词,然后使用 HashMap 的存储,key 存储单词,value 存储出现次数。
public class Problem { public static void main(String args[]) { Map<String, Integer> wordMap = buildWordMap("C:/temp/words.txt"); List<Map.Entry<String, Integer>> list = sortByValueInDecreasingOrder(wordMap); System.out.println("List of repeated word from file and their count"); for (Map.Entry<String, Integer> entry : list) { if (entry.getValue() > 1) { System.out.println(entry.getKey() + " => " + entry.getValue()); } } } public static Map<String, Integer> buildWordMap(String fileName) { // Using diamond operator for clean code Map<String, Integer> wordMap = new HashMap<>(); // Using try-with-resource statement for automatic resource management try (FileInputStream fis = new FileInputStream(fileName); DataInputStream dis = new DataInputStream(fis); BufferedReader br = new BufferedReader(new InputStreamReader(dis))) { // words are separated by whitespace Pattern pattern = Pattern.compile("\\s+"); String line = null; while ((line = br.readLine()) != null) { // do this if case sensitivity is not required i.e. Java = java line = line.toLowerCase(); String[] words = pattern.split(line); for (String word : words) { if (wordMap.containsKey(word)) { wordMap.put(word, (wordMap.get(word) + 1)); } else { wordMap.put(word, 1); } } } } catch (IOException ioex) { ioex.printStackTrace(); } return wordMap; } public static List<Map.Entry<String, Integer>> sortByValueInDecreasingOrder(Map<String, Integer> wordMap) { Set<Map.Entry<String, Integer>> entries = wordMap.entrySet(); List<Map.Entry<String, Integer>> list = new ArrayList<>(entries); list.sort((o1, o2) -> (o2.getValue()).compareTo(o1.getValue())); return list; } }
3. 在没有使用临时变量的情况如何交换两个整数变量的值?
思路:自己构造第三方变量。
int a = 5, b = 8; // 方法一:加减法 a = a + b; // 自己造一个临时变量 b = a - b; a = a - b; // 方法二:异或法 a = a ^ b; // 0101 ^ 1000 = 1100 b = b ^ a; // 1000 ^ (0101 ^ 1000) = 1000 ^ 1000 ^ 0101 = 0000 ^ 0101 = 0101 a = a ^ b; // (0101 ^ 1000) ^ 0101 = 0101 ^ 0101 ^ 1000 = 0000 ^ 1000 = 1000
4. Java 中如何将字符串转换为整数?
思路:①首先校验字符串;②判断数字开头是正号还是负号,设置一个标志位,正号为 1,负号为 -1;③判断字符是否在 0 到 9 之内,是转数字,否则跳出。
public static int stringToInt(String str) { int index = 0; int sign = 1; int digit = 0; int total = 0; char ch; // 1.1判断字符串是否为空。 if (str.length() == 0) { return 0; } // 1.2判断字符串中是否含有空格,如果有就跳过。 while (str.charAt(index) == ' ' && index < str.length()) { index++; } // 2.判断字符串为正还是负。 if (str.charAt(index) == '+' || str.charAt(index) == '-') { if (str.charAt(index) == '+') sign = 1; else { sign = -1; } index++; } // 3.进行处理。 while (index < str.length()) { ch = str.charAt(index); if (ch < '0' || ch > '9') break; digit = ch - '0'; //校验后续 total = total * 10 + digit; 操作之后数字的绝对值的大小,如果超出 MAX_VALUE,则根据负号标志位进行相应的赋值。 if (Integer.MAX_VALUE / 10 < total || Integer.MAX_VALUE / 10 == total && Integer.MAX_VALUE % 10 < digit) return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; total = total * 10 + digit; index++; } return sign * total; }
5. 给定一个 txt 文件,如何得到某字符串出现的次数。
思路:使用正则表达式。
public static int count() throws IOException { //读入文本(字符),用FileReader->BufferedReader //读入输入(字节),用FileInputStream->InputStreamReader->BufferedReader String path = Test.class.getResource("/1.txt").getPath(); BufferedReader br = new BufferedReader(new FileReader(path)); StringBuilder sb = new StringBuilder(); while (true) { String str = br.readLine(); if (str == null) { break; } sb.append(str); } Pattern p = Pattern.compile("mobnet"); Matcher m = p.matcher(sb); int count = 0; while (m.find()) { count++; } return count; }
6. Java 中如何利用泛型写一个 LRU/FIFO 缓存?参考资料
思路:使用 LinkedHashMap 的特性,在参考资料中还有使用 HashMap 的方法去实现,具体思路见参考资料。
7. 打印出数组中的重复元素。参考资料
思路1:双重循环遍历,第一层循环取数,第二层循环负责将其他元素与第一层取出的元素进行比较是否相等。时间复杂度 O(n²)。
思路2:借助 Set 集合的特性,set.add(item) == false,添加失败说明 set 集合中已经存在该元素,只需要将统计数量加 1 即可,添加成功说明 set 集合中不存在该元素,将统计数量置为 1。
思路3:借助 HashMap 集合的特性,使用 key 保存数组元素,value 用于统计数量。