当前位置:   article > 正文

面试遇到的算法题

面试遇到的算法题

1.字符串转换整数

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  6. 返回整数作为最终结果。
  1. class Solution {
  2. public int myAtoi(String s) {
  3. if(s.length() == 0)return 0;
  4. int index = 0,n = s.length(),sign = 1,res = 0;
  5. //处理前置空格
  6. while(index < n && s.charAt(index) == ' ') index++;
  7. //处理符号
  8. if(index < n && (s.charAt(index)=='+' || s.charAt(index)=='-')){
  9. sign = s.charAt(index++) == '+'?1:-1;
  10. }
  11. //处理数字
  12. while(index<n && Character.isDigit(s.charAt(index))){
  13. int digit = s.charAt(index) - '0';
  14. //判断是否溢出
  15. if(res > (Integer.MAX_VALUE - digit)/10){
  16. return sign == 1? Integer.MAX_VALUE : Integer.MIN_VALUE;
  17. }
  18. res = res*10 + digit;
  19. index++;
  20. }
  21. return res*sign;
  22. }
  23. }

2.求岛屿周长

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

思路:直接暴力解法,简单易懂:求边长,其实就是判断每个陆地的四周是什么,从上下左右四个方向找,遇到非陆地就可以+1(其实本题的dfs解法也是这个道理,个人感觉没必要用dfs去做搜索)

  1. class Solution {
  2. public int islandPerimeter(int[][] grid) {
  3. int sum = 0;
  4. for(int i=0;i<grid.length;i++){
  5. for(int j=0;j<grid[0].length;j++){
  6. if(grid[i][j] == 1) sum = dfs(grid,i,j);
  7. }
  8. }
  9. return sum;
  10. }
  11. public int dfs(int[][] grid,int i,int j){
  12. if(i<0 || i>=grid.length || j<0 || j>=grid[0].length || grid[i][j] == 0)return 1;
  13. if(grid[i][j] == -1)return 0;
  14. grid[i][j] = -1;
  15. int count = 0;
  16. count += dfs(grid,i+1,j);
  17. count += dfs(grid,i,j+1);
  18. count += dfs(grid,i-1,j);
  19. count += dfs(grid,i,j-1);
  20. return count;
  21. }
  22. }

3.设计微信抢红包算法

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Random;
  4. import java.util.Scanner;
  5. public class Main {
  6. /*Random 随机生成一个区间在[min , max]的数值
  7. randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数
  8. int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; */
  9. /**
  10. * 生成min到max范围的浮点数
  11. **/
  12. public static double nextDouble(final double min, final double max) {
  13. return min + ((max - min) * new Random().nextDouble());
  14. }
  15. public static String format(double value) {
  16. return new java.text.DecimalFormat("0.00").format(value); // 保留两位小数
  17. }
  18. //二倍均值法
  19. public static List<Double> doubleMeanMethod(double money,int number){
  20. List<Double> result = new ArrayList<Double>();
  21. if(money<0&&number<1)
  22. return null;
  23. double amount,sum=0;
  24. int remainingNumber=number;
  25. int i=1;
  26. while(remainingNumber>1){
  27. amount= nextDouble(0.01,2*(money/remainingNumber));
  28. sum+=amount;
  29. System.out.println("第"+i+"个人领取的红包金额为:"+format(amount));
  30. money -= amount;
  31. remainingNumber--;
  32. result.add(amount);
  33. i++;
  34. }
  35. result.add(money);
  36. System.out.println("第"+i+"个人领取的红包金额为:"+format(money));
  37. sum+=money;
  38. System.out.println("验证发出的红包总金额为:"+format(sum));
  39. return result;
  40. }
  41. public static void main(String[] args) {
  42. Scanner sc = new Scanner(System.in);
  43. int number;
  44. double money;
  45. System.out.print("请输入红包总金额:");
  46. money = sc.nextDouble();
  47. System.out.print("请输入红包数量:");
  48. number = sc.nextInt();
  49. //System.out.println(money + " " + number);
  50. //二倍均值法
  51. doubleMeanMethod(money,number);
  52. //System.out.println(doubleMeanMethod(money,number).toString());
  53. //也是可以直接输出list的,为了观察方便,我就在循环中输出了,存在list里主要是为了后续方便数据的使用
  54. System.out.println();
  55. }
  56. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/422468
推荐阅读
相关标签
  

闽ICP备14008679号