大家好,我是LvZi,今天带来
笔试狂刷--Day7
一.Fibonacci数列
1.题目链接
链接:
Fibonacci数列
2.分析
在求解fib数列的过程中判断什么时候接近最小值
3.代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int a = 0, b = 1, c = 0;// 在求解fib数列的过程中判断什么时候接近最小值
while(n > c) {
a = b;
b = c;
c = a + b;
}
// 出循环
System.out.println(Math.min(c - n, n - b));
}
}
总结:
- 笔者最开始的思路和上述一致,但是没有想到使用三个变量来维护
fib数列
,而是使用的数组,其实求解算法就是这样,先跑通,再想优化,很难一下子就写出最优解
二.杨辉三角
1.题目链接
链接:
杨辉三角
2.分析
简单的动态规划 + 格式化打印
3.代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] dp = new int[n + 1][n + 1];
dp[1][1] = 1;
for(int i = 2; i <= n; i++) {
for(int j = 1; j <= i; j++) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= i; j++) {
System.out.printf("%5d",dp[i][j]);//格式化打印
}
System.out.println();
}
}
}
三.单词搜索
1.题目链接
链接:
单词搜索
2.分析
dfs搜索
3.代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param board string字符串一维数组
* @param word string字符串
* @return bool布尔型
*/
int[] dx = new int[] {-1, 1, 0, 0};
int[] dy = new int[] {0, 0, -1, 1};
public boolean exist (String[] board, String word) {
// write code here
char[][] grid = new char[board.length][board[0].length()];
for (int i = 0; i < board.length; i++) {
grid[i] = board[i].toCharArray();
}
boolean[][] visited = new boolean[grid.length][grid[0].length];
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (word.charAt(0) == grid[i][j]) {
if (dfs(grid, word, 0, i, j, visited)) return true;
}
}
}
return false;
}
private boolean dfs(char[][] grid, String word, int depth, int x, int y,
boolean[][] visited) {
// 所有字符判断完了,返回true
if (depth == word.length()) {
return true;
}
// 越界或访问过或字符不等,返回false
if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length ||
visited[x][y] || grid[x][y] != word.charAt(depth)) {
return false;
}
// 尝试4个方向,有一个成功就行
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
if (dfs(grid, word, depth + 1, x + dx[i], y + dy[i], visited)) {
return true;
}
}
// 回溯
visited[x][y] = false;
return false;
}
}