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

浙公网安备 33010602011771号