`
爱宝贝丶
  • 浏览: 7561 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
在目标字符串中找出第一个与模式字符串匹配的子串 算法
/**
 * 由于模式字符串的长度是一定的,那么在进行匹配的时候可以在目标字符串中进行一次循环遍历
 * 当模式串的hash值和目标串中长度与模式串相同的子串的hash值相等时该子串就有可能是要求解
 * 的子串,然后进行一次全匹配即可判断出结果;另外在目标串中进行hash值的计算时,由于第
 * i+1个子串的hash值与第i个子串的hash值有一定的关系,因而可以迅速计算出结果
 */
public class Solution {
  public int getFirstMatchedString(String goal, String pattern) { // abcdef  def
    if (goal.length() < pattern.length()) {
      return -1;
    }

    int hashGoal = computeHashCode(goal.substring(0, pattern.length()));
    int hashPattern = computeHashCode(pattern);

    for (int i = 0; i <= goal.length() - pattern.length(); i++) {
      if (hashGoal == hashPattern && goal.substring(i, i + pattern.length()).equals(pattern)) {
        return i;
      }
      hashGoal = computeHashCode(goal, i + 1, pattern.length(), hashGoal);
    }

    return -1;
  }

  private int computeHashCode(String goal, int index, int k, int oldHashCode) {
    return 31 * oldHashCode + goal.charAt(index - 1 + k) - ((int) Math.pow(31, k)) * goal.charAt(index - 1);
  }

  private int computeHashCode(String str) {
    return str.hashCode();
  }
}
求幂运算 算法
  private long pow(int x, int n) {
    if (n == 1) {
      return x;
    }
    if (n % 2 == 0) {
      return pow(x * x, n / 2);
    } else {
      return x * pow(x * x, (n - 1) / 2);
    }
  }
判断两个数的和是否溢出 算法
x = a + b;
if ((x^a) < 0 && (x^b) < 0)
{
    //overflow, do something
}
求两个数的最大公约数(递归法) 算法
  /**
   * 求两个数的最大公约数
   * @param m
   * @param n
   * @return
   */
  private int gcd(int m, int n) {
    if (m == n) {
      return m;
    }
    if (m < n) {
      m ^= n;
      n ^= m;
      m ^= n;
    }
    if (isEven(m) && isEven(n)) {
      return 2 * gcd(m >> 1, n >> 1);
    } else if (isEven(m) && isOdd(n)) {
      return gcd(m >> 1, n);
    } else if (isOdd(m) && isEven(n)) {
      return gcd(m, n >> 1);
    } else {
      return gcd((m + n) >> 1, (m - n) >> 1);
    }
  }

  private boolean isEven(int m) {
    return m % 2 == 0;
  }

  private boolean isOdd(int m) {
    return m % 2 == 1;
  }
求两个数的最大公约数(取余法) 算法
  /**
   * 求两个数的最大公约数
   * @param m
   * @param n
   * @return
   */
  private int gcd(int m, int n) {
    if (m < n) {
      m = m ^ n;
      n = n ^ m;
      m = m ^ n;
    }
    int r = 0;
    while ((r = m % n) != 0) {
      m = n;
      n = r;
    }
    return n;
  }
查找数组中下标与元素值相同的元素索引 算法
  /**
   * 查找数组中下标与元素值相同的元素的索引,没找到则返回-1
   * @param arr 需要查找的数组
   * @return 查找到的数组的索引
   */
  private int find(int[] arr) {
    int i = 0, j = arr.length - 1;
    while (i <= j) {
      int mid = (i + j) / 2;
      if (arr[mid] == mid) {
        return mid;
      }
      if (arr[mid] > mid) {
        j = mid - 1;
      } else {
        i = mid + 1;
      }
    }
    return -1;
  }
多项式函数式计算 算法
  /**
   * 计算函数式f(x) = a[n]x^n + a[n-1]x^(n-1) + a[n-2]x^(n-2) + ...+ a[0]算法,
   * 这里params数组中保存的是函数式的参数,顺序为从左到右,函数最高幂次为params.length - 1
   * @param params 参数数组
   * @param x 计算的变量
   * @return 计算结果
   */
  private double compute(double[] params, double x) {
    double poly = 0;
    for (int i = 0; i < params.length; i++) {
      poly = x * poly + params[i];
    }
    return poly;
  }
Global site tag (gtag.js) - Google Analytics