Java---每日小题
题目1-极大极小游戏
给你一个下标从 0 开始的整数数组
nums
,其长度是2
的幂。对
nums
执行下述算法:
- 设
n
等于nums
的长度,如果n == 1
,终止 算法过程。否则,创建 一个新的整数数组newNums
,新数组长度为n / 2
,下标从 0 开始。- 对于满足
0 <= i < n / 2
的每个 偶数 下标i
,将newNums[i]
赋值 为min(nums[2 * i], nums[2 * i + 1])
。- 对于满足
0 <= i < n / 2
的每个 奇数 下标i
,将newNums[i]
赋值 为max(nums[2 * i], nums[2 * i + 1])
。- 用
newNums
替换nums
。- 从步骤 1 开始 重复 整个过程。
执行算法后,返回
nums
中剩下的那个数字。示例 1:
输入:nums = [1,3,5,2,4,8,2,2] 输出:1 解释:重复执行算法会得到下述数组。 第一轮:nums = [1,5,4,2] 第二轮:nums = [1,4] 第三轮:nums = [1] 1 是最后剩下的那个数字,返回 1 。示例 2:
输入:nums = [3] 输出:3 解释:3 就是最后剩下的数字,返回 3 。提示:
1 <= nums.length <= 1024
1 <= nums[i] <= 109
nums.length
是2
的幂
参考答案
class Solution {public int minMaxGame(int[] nums) {//迭代if(nums.length==1){return nums[0];}int n=nums.length/2;int[] newNums=new int[n];for(int i=0;i<n;i++){if(i%2==0){newNums[i]=Math.min(nums[2*i],nums[2*i+1]); }else{newNums[i]=Math.max(nums[2*i],nums[2*i+1]); }}return minMaxGame(newNums);}}
题目2-计算布尔二叉树的值
给你一棵 完整二叉树 的根,这棵树有以下特征:
- 叶子节点 要么值为
0
要么值为1
,其中0
表示False
,1
表示True
。- 非叶子节点 要么值为
2
要么值为3
,其中2
表示逻辑或OR
,3
表示逻辑与AND
。计算 一个节点的值方式如下:
- 如果节点是个叶子节点,那么节点的 值 为它本身,即
True
或者False
。- 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。
返回根节点
root
的布尔运算值。完整二叉树 是每个节点有
0
个或者2
个孩子的二叉树。叶子节点 是没有孩子的节点。
示例 1:
输入:root = [2,1,3,null,null,0,1] 输出:true 解释:上图展示了计算过程。 AND 与运算节点的值为 False AND True = False 。 OR 运算节点的值为 True OR False = True 。 根节点的值为 True ,所以我们返回 true 。示例 2:
输入:root = [0] 输出:false 解释:根节点是叶子节点,且值为 false,所以我们返回 false 。提示:
- 树中节点数目在
[1, 1000]
之间。0 <= Node.val <= 3
- 每个节点的孩子数为
0
或2
。- 叶子节点的值为
0
或1
。- 非叶子节点的值为
2
或3
。
参考答案
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean evaluateTree(TreeNode root) {if(root==null){return false;}if(root.left==null){if(root.val==1){return true;}else{return false;}}else{if(root.val==2){return evaluateTree(root.left)||evaluateTree(root.right);}else{return evaluateTree(root.left)&&evaluateTree(root.right);}}}
}
题目3-3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回
true
;否则,返回false
。整数
n
是 3 的幂次方需满足:存在整数x
使得n == 3x
示例 1:
输入:n = 27 输出:true示例 2:
输入:n = 0 输出:false示例 3:
输入:n = 9 输出:true示例 4:
输入:n = 45 输出:false提示:
-231 <= n <= 231 - 1
参考答案
class Solution {public boolean isPowerOfThree(int n) {while(n!=0&&n%3==0){n=n/3;}return n==1;//跳出循环结束后,检查n是否等于1,是则返回true,否则返回false}
}
题目4-翻转链表
给定一个头节点为
head
的单链表用于记录一系列核心肌群训练编号,请将该系列训练编号 倒序 记录于链表并返回。示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2:
输入:head = [1,2] 输出:[2,1]示例 3:
输入:head = [] 输出:[]提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
题解
接着
以此类推,直到head真的到达head的位置,递归完毕;返回newNode节点;
参考答案
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode trainningPlan(ListNode head) {if(head==null||head.next==null){//跳出递归的位置return head;}ListNode newNode=trainningPlan(head.next);head.next.next=head;head.next=null;return newNode;}
}
题目5
Alice 和 Bob 正在玩一个游戏。最初,Alice 有一个字符串
word = "a"
。给定一个正整数
k
。现在 Bob 会要求 Alice 执行以下操作 无限次 :
- 将
word
中的每个字符 更改 为英文字母表中的 下一个 字符来生成一个新字符串,并将其 追加 到原始的word
。例如,对
"c"
进行操作生成"cd"
,对"zb"
进行操作生成"zbac"
。在执行足够多的操作后,
word
中 至少 存在k
个字符,此时返回word
中第k
个字符的值。注意,在操作中字符
'z'
可以变成'a'
。示例 1:
输入:k = 5
输出:"b"
解释:
最初,
word = "a"
。需要进行三次操作:
- 生成的字符串是
"b"
,word
变为"ab"
。- 生成的字符串是
"bc"
,word
变为"abbc"
。- 生成的字符串是
"bccd"
,word
变为"abbcbccd"
。示例 2:
输入:k = 10
输出:"c"
提示:
1 <= k <= 500
参考答案
class Solution {public char kthCharacter(int k) {StringBuffer word=new StringBuffer();//申请可变字符串word.append("a");while(word.length()<k){int l=word.length();for(int i=0;i<l;i++){word.append((char) (word.charAt(i)+1));}}return word.charAt(k-1);//第k个,下标为k-1}
}
严谨而言:
class Solution {public char kthCharacter(int k) {StringBuffer word=new StringBuffer();//申请可变字符串word.append("a");while(word.length()<k){int l=word.length();for(int i=0;i<l;i++){char c=(char) (word.charAt(i)+1);if(word.charAt(i)=='z'){//处理z则添加a的问题c='a';}word.append(c);}}return word.charAt(k-1);//第k个,下标为k-1}
}
其实上面就完全够用了,提示不用再对"注意,在操作中字符 'z'
可以变成 'a'
"做单独处理;因为1 <= k <= 500,提示已经给出了,即从a永远不会到达z。