算法分析(含答案)笔试题 (5)

if(root.data >= lastVisit && judgeLeft) { // 当前节点比上
次访问的数值要大
lastVisit = root.data;
} else {
return false;
}
boolean judgeRight = isValidBST(root.right); // 后判断右
子树
return judgeRight; } }
643. 从一个链表中删除节点
题目: 写一个函数用于在一个单向链表中删除一个节点(⾮非尾节点),前提是仅仅能够访
问要删除的那个节点。
比如给定链表 1 -> 3 -> 5 -> 7 -> 9 -> 16,给定你值为 3 的那个节点, 调⽤用你的函数
后,链表变为
1 -> 5 -> 7 -> 9 -> 16。
/**
Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }

}
*/
public class Solution {
public void deleteNode(ListNode node) {
if(nodenull||node.nextnull) {
System.out.println("节点不存在或者是尾节点");
}else{
node.val=node.next.val;
node.next=node.next.next; } }
}

二叉搜索树 BST 中第 Kth 小的元素 题目:给定⼀个 BST,写一个函数
kthSmallest 来找到第 kth 小的元素
/**
Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }

}
*/
public class Solution2 {
public int kthSmallest(TreeNode root, int k) {
Stack store = new Stack();
if (root == null) {
return -1;
}
store.push(root);
while (root.left != null) {
store.push(root.left);
root = root.left;
}
while (!store.empty()) {
TreeNode cur = store.pop();
k--;
if (k == 0) {
return cur.val;
}
if (cur.right != null) {
root = cur.right;// let cur.right be the current node
store.push(root);
while (root.left != null) {
store.push(root.left);
root = root.left;
}
}
}
return -1;
}
}

题目:给定含有 n 个整数的数组 S,S 中是否存在三个元素 a,b,c 使得 a

b + c = 0? 找到所有这样的三元 组,并且结果集中不包含重复的三元组。
比如,
S = [-1, 0, 1, 2, -1, -4],,
结果集为: [
[-1, 0, 1],
[-1, -1, 2]
]
/**

给定一个 n 个元素的数组,是否存在 a,b,c 三个元素,使用得 a+b+c=0,找
出所有符合这个条件的三元组

注意: - 三元组中的元素必须是非递减的 - 结果不能包含重复元素
*/
public class Solution {

public static void main(String[] args) {
int[] S = {-1, 0, 1, 2, -1, -4,-3,-4,4,3};
new Solution().get3Sum(S);
}

public Set get3Sum(int[] S){

if(S.length<3 || S==null){
return null;
}

//接收拼接的字符串
StringBuffer sb = new StringBuffer();
for(int i=0; i<S.length; i++){
for(int j=0; j<S.length; j++){
for(int z=0; z<S.length; z++){
//筛选出不是递减的一组元素
if(S[i]<=S[j] && S[j]<=S[z]){
int sum = S[i] + S[j] + S[z];
if(sum==0){
String str =
"("+S[i]+","+S[j]+","+S[z]+")";
sb.append(str+";");
}
}
}
}
}

String s = sb.toString();
s = s.substring(0, sb.length()-1);
String[] arr = s.split(";");

Set set = new HashSet();
//将所筛选出来的元素放入 Set 集合中,去重
for (int k = 0; k < arr.length; k++) {
set.add(arr[k]);
}
System.out.println(set);
return set;
}

public List<List> threeSum(int[] nums) {
List<List> result = new LinkedList<>();

if (nums != null && nums.length > 2) {
// 先对数组进行排序
Arrays.sort(nums);
// i 表示假设取第 i 个数作为结果
for (int i = 0; i < nums.length - 2; ) {
// 第二个数可能的起始位置
int j = i + 1;
// 第三个数可能是结束位置
int k = nums.length - 1;
while (j < k) {
// 如果找到满足条件的解
if (nums[j] + nums[k] == -nums[i]) {
// 将结果添加到结果含集中
List list = new ArrayList<>(3);
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
result.add(list);
// 移动到下一个位置,找下一组解
k--;
j++;

// 从左向右找第一个与之前处理的数不同的数的下标
while (j < k && nums[j] == nums[j - 1]) {
j++;
}
// 从右向左找第一个与之前处理的数不同的数的下标
while (j < k && nums[k] == nums[k + 1]) {
k--;
}
}
// 和大于 0
else if (nums[j] + nums[k] > -nums[i]) {
k--;
// 从右向左找第一个与之前处理的数不同的数的下标
while (j < k && nums[k] == nums[k + 1]) {
k--;
}
}
// 和小于 0
else {
j++;
// 从左向右找第一个与之前处理的数不同的数的下标
while (j < k && nums[j] == nums[j - 1]) {
j++;
}
}
}
// 指向下一个要处理的数
i++;
// 从左向右找第一个与之前处理的数不同的数的下标
while (i < nums.length - 2 && nums[i] == nums[i - 1])
{
i++;
}
}
}
return result;
}
}
646. 子集问题
题目: 给定一个不包含相同元素的整数集合,nums,返回所有可能的子集集合。解答
中集合不能包含重 复的子集。
比如,
nums = [1, 2, 3], ⼀一种解答为:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2], []
]
/**

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfxsw.html