面试(编程题)

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;
    }
}
View Code

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;
    }
}
View Code

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
View Code

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;
}
View Code

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;
}
View Code

6. Java 中如何利用泛型写一个 LRU/FIFO 缓存?参考资料

思路:使用 LinkedHashMap 的特性,在参考资料中还有使用 HashMap 的方法去实现,具体思路见参考资料。

7. 打印出数组中的重复元素。参考资料

思路1:双重循环遍历,第一层循环取数,第二层循环负责将其他元素与第一层取出的元素进行比较是否相等。时间复杂度 O(n²)。

思路2:借助 Set 集合的特性,set.add(item) == false,添加失败说明 set 集合中已经存在该元素,只需要将统计数量加 1 即可,添加成功说明 set 集合中不存在该元素,将统计数量置为 1。

思路3:借助 HashMap 集合的特性,使用 key 保存数组元素,value 用于统计数量。

 

转载于:https://www.cnblogs.com/westboy/p/8667332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值