面试算法题

论坛 期权论坛     
选择匿名的用户   2021-5-30 21:03   46   0
<p>1:连续子序列最大乘积 <a href="https://blog.csdn.net/seagal890/article/details/91358875">https://blog.csdn.net/seagal890/article/details/91358875</a> 有可能前面负数乘以负数很大</p>
<pre class="blockcode"><code class="language-java">package com.bean.algorithmbasic;

public class MaximumProductSubarray {

public static int maxProduct(int[] nums) {
  //如果数组为null或者数组长度为0,直接返回0.
        if (nums &#61;&#61; null || nums.length &#61;&#61; 0) {
            return 0;
        }
        
        //开始将A[0]分别设置为:最大值、最小值,和最终的返回结果。
        int max &#61; nums[0], min &#61; nums[0], result &#61; nums[0];
        //从数组的第二个元素开始取值
        for (int i &#61; 1; i &lt; nums.length; i&#43;&#43;) {
            int temp &#61; max;
            //状态转换方程的定义和实现
            max &#61; Math.max(Math.max(max * nums[i], min * nums[i]), nums[i]);
            min &#61; Math.min(Math.min(temp * nums[i], min * nums[i]), nums[i]);
            //始终用result存放最大值,以返回结果。
            if (max &gt; result) {
                result &#61; max;
            }
        }
        return result;
    }

public static void main(String[] args) {
  // TODO Auto-generated method stub
  int[] arraydemo&#61; {2,5,-1,2,-1};
  int RESULT&#61;maxProduct(arraydemo);
  System.out.println(&#34;RESULT IS: &#34;&#43;RESULT);
}

}</code></pre>
<p>2:快速排序选取topk:<a href="https://www.lmlphp.com/user/5986/article/item/340698/">https://www.lmlphp.com/user/5986/article/item/340698/</a>    二分思想,如果小的话直接返回,否则选择排序长度</p>
<p>3:Java 蒙特卡洛算法求圆周率近似值实例详解 <a href="https://www.jb51.net/article/123408.htm">https://www.jb51.net/article/123408.htm</a></p>
<pre class="blockcode"><code class="language-java">package com.xu.main;
import java.util.Scanner;
public class P9_1 {
static double MontePI(int n) {
  double PI;
  double x, y;
  int i, sum;
  sum &#61; 0;
  for (i &#61; 1; i &lt; n; i&#43;&#43;) {
   x &#61; Math.random();
   y &#61; Math.random();
   if ((x * x &#43; y * y) &lt;&#61; 1) {
    sum&#43;&#43;;
   }
  }
  PI &#61; 4.0 * sum / n;
  return PI;
}
public static void main(String[] args) {
  int n;
  double PI;
  System.out.println(&#34;蒙特卡洛概率算法计算圆周率:&#34;);
  Scanner input &#61; new Scanner(System.in);
  System.out.println(&#34;输入点的数量:&#34;);
  n &#61; input.nextInt();
  PI &#61; MontePI(n);
  System.out.println(&#34;PI&#61;&#34;&#43;PI);
}
}</code></pre>
<p>4:链表上的快速排序(first指向前一个元素,second指向后一个,second遇到小的,first往后走一个然后交换,最后要交换一下中轴和first)</p>
<pre class="blockcode"><code class="language-java">public void quickSort(ListNode begin, ListNode end) {
        //判断为空,判断是不是只有一个节点
        if (begin &#61;&#61; null || end &#61;&#61; null || begin &#61;&#61; end)
            return;
        //从第一个节点和第一个节点的后面一个几点
        ListNode first &#61; begin;
        ListNode second &#61; begin.next;

        int nMidValue &#61; begin.val;
        //结束条件,second到最后了
        while (second !&#61; end.next &amp;&amp; second !&#61; null) {
            if (second.val &lt; nMidValue) {
                first &#61; first.next;
                //判断一下,避免后面的数比第一个数小,不用换的局面
                if (first !&#61; second) {
                    int temp &#61; first.val;
                    first.val &#61; second.val;
                    second.val &#61; temp;
                }
            }
            second &#61; second.next;
        }
        //判断,有些情况是不用换的,提升性能
        if (begin !&#61; first) {
            int temp &#61; begin.val;
            begin.val &#61; first.val;
            first.val &#61; temp;
        }
        //前部分递归
        quickSort(begin, first);
        //后部分递归
        quickSort(first.next, end);
    }</code></pre>
<p> </p>
<p>5:AVL树调整</p>
<p>6:编辑距离</p>
<pre class="blockcode"><code class="language-java">package com.legend.code;

public class MinDistance {
    public static int minDistance(String word1, String word2) {
        //dp[i][j]表示源串A位置i到目标串B位置j处最低需要操作的次数
        int[][] dp &#61; new int[word1.length() &#43; 1][word2.length() &#43; 1];
        for(int i &#61; 0; i&lt; word1.length() &#43; 1; i&#43;&#43;){
            dp[i][0] &#61; i;
        }
        for(int j &#61; 0; j&lt; word2.length() &#43; 1; j&#43;&#43;){
            dp[0][j] &#61; j;
        }
        for(int i &#61; 1; i&lt; word1.length() &#43; 1; i&#43;&#43;){
            for(int j &#61; 1; j&lt; word2.length() &#43; 1; j&#43;&#43;){
                if(word1.charAt(i - 1) &#61;&#61; word2.charAt(j - 1)){  // 第i个字符是字符串下标为i-1第哪个
                    dp[i][j] &#61; dp[i - 1][j - 1];
                }else{
                    dp[i][j] &#61; (Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1])) &#43; 1;
                }
            }
        }
        return dp[word1.length()][word2.length()];
    }
    public static void main(String[] args)
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP