第35天--算法(牛客网剑指offer2)


1.JZ13 机器人的运动范围

int ans = 0;
public int movingCount(int threshold, int rows, int cols) {
  boolean dp[][] = new boolean[rows][cols];
  process(dp,threshold,0,0,rows,cols);
  return ans;
}
public void process(boolean dp[][],int threshold,int i,int j,int rows,int cols) {
  if(i < 0 || j < 0 || i == rows || j == cols || minus(i,j) > threshold || dp[i][j]) {
    return;
  }
  dp[i][j] = true;
  ans ++;
  process(dp,threshold,i + 1,j,rows,cols);
  process(dp,threshold,i - 1,j,rows,cols);
  process(dp,threshold,i,j + 1,rows,cols);
  process(dp,threshold,i,j - 1,rows,cols);
}
public int minus(int x,int y) {
  int ansX = 0;
  int ansY = 0;
  while(x != 0) {
    ansX += x % 10;
    x /= 10;
  }
  while(y != 0) {
    ansY += y % 10;
    y /= 10;
  }
  return ansX + ansY;
}

2.JZ14 剪绳子

public int cutRope(int target) {
  if(target == 1 || target == 2) {
    return 1;
  }
  if(target == 3) {
    return 2;
  }
  if(target == 4) {
    return 4;
  }
  int ans = 1;
  while(target >= 5) {
    target -= 3;
    ans *= 3;
  }
  ans *= target;
  return ans;
}

3.JZ15 二进制中1的个数

public int NumberOf1(int n) {
  int ans = 0;
  while(n != 0) {
    n &= (n - 1);
    ans ++;
  }
  return ans;
}

4.JZ16 数值的整数次方

public double Power(double x,int y) {
  if(y == 0) {
    return 1D;
  }
  if(x == 1) {
    return 1D;
  }
  if(x == -1) {
    if((y & 1) == 0) {
      return 1D;
    }else {
      return -1D;
    }
  }
  if(y == Integer.MIN_VALUE) {
    return 0;
  }
  double t = x;
  double ans = 1;
  boolean isFu = y < 0;
  y = isFu ? -y : y;
  while(y != 0) {
    if((y & 1) != 0) {
      ans *= t;
    }
    t *= t;
    y >>= 1;
  }
  return isFu ? 1D / ans : ans;
}

5.JZ17 打印从1到最大的n位数(看似很垃圾的题,其实如果考大数就不简单了,大数解法先不写了-。-)

public int[] printNumbers (int n) {
  int ans[] = new int[(int) Math.pow(10,n) - 1];
  for(int i = 0;i < ans.length;i ++) {
    ans[i] = i + 1;
  }
  return ans;
}

6.JZ18 删除链表的节点

public ListNode deleteNode (ListNode head, int val) {
  ListNode temp1 = head;
  ListNode temp2 = head.next;
  if(head.val == val) {
    return head.next;
  }
  while(temp2.next != null) {
    if(temp2.val == val) {
      temp1.next = temp1.next.next;
      break;
    }else {
      temp1 = temp1.next;
      temp2 = temp2.next;
    }
  }
  return head;
}

7.JZ19 正则表达式匹配(代码没问题,过不去牛客网是因为测试用例有问题!!! 能过去LeetCode)

public boolean isMatch (String str, String pattern) {         char s1[] = str.toCharArray();         char p1[] = pattern.toCharArray();         int M = s1.length;         int N = p1.length;         boolean dp[][] = new boolean[M + 1][N + 1];         dp[M][N] = true;         if(M > 0 && N > 0) {             if(s1[M - 1] == p1[N - 1] || p1[N - 1] == '.') {                 dp[M - 1][N - 1] = true;             }         }         for(int pi = N - 2;pi >= 0;pi --) {             if(pi + 1 < p1.length && p1[pi + 1] == '*') {                 dp[M][pi] = dp[M][pi + 2];             }         }         for(int si = M - 1;si >= 0;si --) {             for(int pi = N - 2;pi >= 0;pi --) {                 if(pi + 1 > p1.length || p1[pi + 1] != '*') {                     dp[si][pi] = (s1[si] == p1[pi] || p1[pi] == '.') && dp[si + 1][pi + 1];                     continue;                 }                 if(s1[si] != p1[pi] && p1[pi] != '.') {                     dp[si][pi] = dp[si][pi + 2];                     continue;                 }                 if(dp[si][pi + 2]) {                     dp[si][pi] = true;                     continue;                 }                 int i = si;                 while(i < s1.length && (s1[i] == p1[pi] || p1[pi] == '.')) {                     if(dp[i + 1][pi + 2]) {                         dp[si][pi] = true;                     }                     i ++;                 }             }         }         return dp[0][0];     } 8.JZ20 表示数值的字符串 public boolean isNumber (String s) {         s = s.trim();         if(s.length() == 0) {             return false;         }         if(s.charAt(0) == '+' || s.charAt(0) == '-') {             s = s.substring(1);         }         s = s.replace('E','e');         if(s.indexOf('e') >= 0) {             int index = s.indexOf('e');             String first = s.substring(0,index);             String second = s.substring(index + 1);             if(second.length() > 0) {                 if(second.charAt(0) == '+' || second.charAt(0) == '-') {                     second = second.substring(1);                 }             }             return isValidNumber(first) && isPureValidNumber(second);         }         return isValidNumber(s);     }     public boolean isValidNumber(String s) {         if(s.indexOf('.') >= 0) {             int index = s.indexOf('.');             String first = s.substring(0,index);             String second = s.substring(index + 1);             if(first.length() > 0 && second.length() > 0) {                 return isPureValidNumber(first) && isPureValidNumber(second);             }else if(first.length() > 0) {                 return isPureValidNumber(first);             }else {                 return isPureValidNumber(second);             }         }         return isPureValidNumber(s);     }     public boolean isPureValidNumber(String s) {         if(s.length() == 0) {             return false;         }         for(int i = 0;i < s.length();i ++) {             if(s.charAt(i) < '0' || s.charAt(i) > '9') {                 return false;             }         }         return true;     }

9.JZ21 调整数组顺序使奇数位于偶数前面(一)

public int[] reOrderArray (int[] array) {

  int nEven[] = new int[array.length];
  int even[] = new int[array.length];
  int i1 = 0;
  int i2 = 0;
  for(int i = 0;i < array.length;i ++) {
    if((array[i] & 1) == 0) {
      even[i2 ++] = array[i];
    }else {
      nEven[i1 ++] = array[i];
    }
  }
  i1 --;
  i2 --;
  for(int i = 0;i <= i1;i ++) {
    array[i] = nEven[i];
  }
  for(int i = i1 + 1,j = 0;i < array.length;i ++,j ++) {
    array[i] = even[j];
  }
  return array;
}

10.JZ22 链表中倒数最后k个结点

public ListNode FindKthToTail (ListNode pHead, int k) {
  ListNode temp1 = pHead;
  while(k != 1) {
    k --;
    if(temp1 != null) {
      temp1 = temp1.next;
    }
  }
  if(temp1 == null) {
    return null;
  }
  ListNode temp2 = pHead;
  while(temp1.next != null) {
    temp1 = temp1.next;
    temp2 = temp2.next;
  }
  return temp2;
}