第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;
}

 

posted @ 2022-02-24 11:00  现在开始努力  阅读(44)  评论(0)    收藏  举报