剑指offer:12-17记录

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

 

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
提示:

1 <= board.length <= 200
1 <= board[i].length <= 200

dfs

/*
思路:
主方法:对每个点dfs
dfs方法:1、结束条件 2、记录并做标记 3、尝试周围 4、回溯,恢复原样 5、返回值
*/
class Solution {char[] words;char[][] board;public boolean exist(char[][] board, String word) {this.board=board;words = word.toCharArray();for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {if(dfs(i, j, 0)) return true;}}return false;}boolean dfs(int i, int j, int k) {if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != words[k]) return false;if(k == words.length - 1) return true;char tmp = board[i][j];board[i][j] = '/';boolean res = dfs(i + 1, j, k + 1) || dfs(i - 1, j, k + 1) || dfs(i, j + 1, k + 1) || dfs(i , j - 1, k + 1);board[i][j] = tmp;return res;}
}

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:

2 <= n <= 58

leetcode343. 整数拆分

class Solution {public int cuttingRope(int n) {int[] dp = new int[n + 1];dp[1]=1;for (int i = 2; i <= n; i++)for (int j = 1; j < i; j++)dp[i] = Math.max(dp[i], Math.max(j,dp[j]) * (i - j));return dp[n];}
}

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

 

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
 

提示:

2 <= n <= 1000

思路:

和上一题的区别的数范围很大。

动态规划不好比较大小,因为会取模。

如果用大数类,太麻烦,而且失去意义。

我们首先考虑对于一段长n的绳子,我们可以切出的结果包含什么?

1会包含吗? 不会,因为1 * (k - 1) < k, 只要把1和任何一个其他的片段组合在一起就有个更大的值
2可以
3可以
4可以吗? 它拆成两个2的效果和本身一样,因此也不考虑
5以上可以吗? 不可以,这些绳子必须拆,因为总有一种拆法比不拆更优,比如拆成 k / 2 和 k - k / 2

综上, 最后的结果只包含2和3(当然当总长度为2和3时单独处理), 那么很显然n >= 5时, 3*(n - 3) >= 2 * (n - 2) ,因此我们优先拆成3,最后剩余的拆成2。最后的结果一定是由若干个3和1或2个2组成.

class Solution {public int cuttingRope(int n) {if(n == 2) {return 1;}if(n == 3){return 2;}int mod = (int)1e9 + 7;long res = 1;while(n > 4) {res *= 3;res %= mod;n -= 3;}return (int)(res * n % mod);}
}

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

思路:对每一位判断即可。

public class Solution {public int hammingWeight(int n) {int res = 0;while(n != 0) {res += n & 1;n >>>= 1;}return res;}
}

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

 

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
 

说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

快速幂

temp是每一位是多少,ans是答案。(注意都是幂关系,全是乘)

class Solution {public double myPow(double x, int n) {if (n < 0) {x = 1 / x;n = -n;}double ans=1;double temp=x;while(n != 0) {if((n & 1) == 1)ans*=temp;n >>>= 1;temp*=temp;}return ans;}
}

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:

输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
 

说明:

用返回一个整数列表来代替打印
n 为正整数

估计是想考大数呢。但是无脑直接过了。

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指offer:18-21记录

给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 注意&#xff1a;此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点&#xff0c;那么在调用…

尚硅谷李老师笔记2

一&#xff1a;MySQL的背景 前身是瑞典的一家公司&#xff0c;MySQLAB 08年被sun公司收购 09年sun公司被oracle公司收购 二&#xff1a;MySQL的优点 1.开源&#xff0c;免费&#xff0c;成本低 2.性能高&#xff0c;移植性好 3.体积小&#xff0c;便于安装 三&#xff1a;MyS…

剑指offer:22-25记录

输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表的尾节点是倒数第1个节点。例如&#xff0c;一个链表有6个节点&#xff0c;从头节点开始&#xff0c;它们的值依次是1、2、3、4、5、6。这个链表的倒…

尚硅谷李老师笔记3DQL

一&#xff1a;语法 select 查询列表 from 表名 二&#xff1a;特点 1.查询列表可以是字段&#xff0c;常量&#xff0c;表达式&#xff0c;函数&#xff0c;也可以是多个的组合结果 2.查询结果是一张虚拟表 三&#xff1a;示例 1.查询单个字段 select 字段名 from 表名 2.查…

java 防止表单重复提交

防止表单重复提交&#xff0c;或者是防止按F5 刷新提交表单。 在WEB开发中是经常会碰到这样的问题的。 目前主流的解决方法有以下三种&#xff1a; 1、采用脚本来解决 2、重定向到别的页面 3、使用s:token 标签 由于我是使用S2SH来开发的&#xff0c;所以就选择了第三种方法。 …

贪吃蛇源代码111

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <time.h> const int H 8; //地图的高 const int L 16; //地图的长 char GameMap[H][L]; //游戏地图 int key; //按键保存 int sum 1, over 0; //蛇…

剑指offer:26-30记录

输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B&#xff1a; 4 / 1 返回 true&#xff0c;因为…

Calendar类 set方法 get方法 add方法

Calendar类 set方法 get方法 add方法 package asd; import java.util.*; public class zixue { public static void main(String[] args) { demo01();//实验的是get()方法&#xff1b; demo02();//实验的是set()方法&#xff1b; } //---------------------------------------…

剑指offer:31-32记录(4道)

输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某栈的压栈序列&#xff0c;序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列&#xff0c;但…

炸窝Vector简介

/** 1.Vector的介绍&#xff1a;* Vector<E>是所有单列集合的鼻祖&#xff0c;但是在JAVA1.2版本之后就被Collection集合所替代&#xff0c;Vector可以实现可增长的对象数组* 与数组一样&#xff0c;它包含可以使用整数索引进行访问的组件* 但是它的大小可以根据需要增加…

剑指offer:33-37记录

输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1a; 5 / \ 2 6 / \ 1 3 示例 1&#xff1a; 输入: [1,6,…

剑指offer:39-42记录

数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制&#xff1a; 1 < 数组长度 < 50000 思路&#xff1a;…

炸窝哈希值的原理

package asdfg; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class aaa { public static void main(String[] args) {/*** 小提示&#xff1a;* 1.对于所有没有索引的方法&#xff0c;我们都不能使用for循环进行遍历* 2.提到接口&am…

剑指offer:45-48记录

输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: [3,30,34,5,9] 输出: "3033459" 提示: 0 < nums.length < 100 说明:…

炸窝(可变函数)

可变函数源码理解&#xff1a;学生角度&#xff0c;更易操作 public static void main(String[] args) {/*int cadd(10,29);System.out.println(c);*///此时可以随意的进行数据的传递add(20,30,40);//[I1db9742:解释&#xff0c;中括号代表是一个数组&#xff0c;为一个地址值…

剑指offer:50-53记录

在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的长度 < 50000 思路&#xff1a;map记录次数&#xff0c;再…

Eclipse安装插件的几种方式

前段时间Google转向了IDEA&#xff0c;貌似有些动摇了Eclipse作为Java领域IDE龙头老大的位置&#xff0c;为此引起了Eclipse粉丝和IDEA粉丝的集体骂战。类似这种骂战向来都不绝于耳&#xff0c;貌似程序员的都比较多&#xff0c;可能大家都是搞技术出身&#xff0c;都很自信。其…

炸窝(Collections当中的addAll方法)

public class aaa { public static void main(String[] args) {/** java.util.Collections是集合工具类&#xff0c;用来对集合进行操作&#xff0c;* * 集合Collections当中的两个方法&#xff1a;* 1.addAll方法&#xff1a;因为是静态方法&#xff0c;嗯所以可以.直接吹风机…

剑指offer:55-58记录

输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …

Map集合知识点(炸窝)

/** * 简单的介绍一下我们接下来准备学习的集合MAP集合 * * Map集合的简单概述&#xff1a; * 其中的健是不能进行重复的&#xff0c;而且每一健只能映射一个值&#xff0c;简单的说就是K与V是一一对应的&#xff0c;不能有其他的关系&#xff0c; * 但是我们注意到value值是可…