数据库
分析:
select SC.S# from (
select max(GRADE) as grade from SC where SC.C# = 'C2'
) as temp
join SC on temp.grade = sc.GRADE
或者:
select sc.S# from (
select S#, RANK() over(order by GRADE desc) rk from SC where SC.C# = 'C2'
) sc
where rk = 1
找出成绩前三名的学号:
select temp.S# from(
select rank() over( order by sc.grade desc) rk , * from SC
) as temp
where rk <= 3
根据C#分组显示成绩排名:
select rank() over( partition by C# order by sc.grade desc) , * from SC
排序:
row_number() :123
rank() : 把并列的显示第一个,后面的顺延 :113
dense_rank() : 并列的一样,后面的连续:112
C
select ename , sal from emp where sal <= (select min(sal) from emp) + 1000
分析:select min(sal) from emp 找出最低工资
(select min(sal) from emp) + 1000 最低工资加一千元
sal <= (select min(sal) from emp) + 1000 不超过最低工资一千元的
B:select sal+1000 from emp where sal <= (select min(sal) from emp) + 1000
A:select ename , sal from emp where sal <= 1000
D: select ename , sal from emp where sal > (select min(sal) from emp) + 1000
多进程 内存分配
填空题:
将一颗多叉树转化为二叉树需要两步:将多叉树的第一个儿子结点作为二叉树的左结点,将其兄弟结点作为二叉树的右结点
数据库保护一般分为:安全性控制、完整性控制、并发行控制、数据的恢复
分析:选B 是“可以”,不是“一定”
分析C:
初始数据集对算法性能无影响的是:堆排序
链接:https://www.nowcoder.com/questionTerminal/dc08e40e6c164dfb89c74c55839dedef?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网
1、算法复杂度与初始状态无关的有:选择排序、堆排序、归并排序、基数排序。
2、元素总比较次数与初始状态无关的有:选择排序、基数排序。
3、元素总移动次数与初始状态无关的有:归并排序、基数排序。
快排:不稳定,最坏O(n*n) 平均 O(n*logn) 最优O(n*logn)
编程大题:
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num[]={-1,0,1,2,-1,4};
Arrays.sort(num);
List<List<Integer>> res=new ArrayList<List<Integer>>();
for(int i=0;i<num.length-2;i++) {
if(i>0&&num[i]==num[i-1])continue;
int temp=-num[i];
int l=i+1;
int r=num.length-1;
while(l<r) {
if(num[l]+num[r]>temp) {
r--;
}
else if(num[l]+num[r]<temp) {
l++;
}
else {
res.add(Arrays.asList(num[i],num[l],num[r]));
l++;
r--;
while(l<r&&l<num.length-2&&num[l]==num[l-1])l++;
while(l<r&&r>0&&num[r]==num[r+1])r--;
}
}
}
for(int j=0;j<res.size();j++)
System.out.println(res.get(j));
}
}
1. 将数组排序
2. 遍历数组,将将 a + b + c = 0 转换为 a + b = -c
3. 如果当前元素与上一个元素一致,直接跳过
4. 定义两个下标,分别从数组两端,即(i+1)跟数组最后一个元素开始,往中间扫描,如果,两元素的和,大于目标值(-c),则后面的下标往前移动;如果两元素的和小于目标值,则前面的下标往后移动;如果正好等于目标值,则发现一组目标,两下标均往中间移动
5. 两下标往中间移动的同时,判断是否与上一个相同,如果相同,继续移动
6. 输出结果
思路:
- 首先对数组进行排序,时间复杂度为O(n*logn)
- 然后对数组进行两层的遍历,先取出当前遍历的数字为nums[i],然后从数组两侧取出数字分别为nums[begin]和nums[end],然后三个数求和值为sum
- sum == 0,将三个数加入结果之中,同时将两侧的下标向中间移动,直到不与之前取出的数字相同,避免出现重复的三元组
- sum > 0,因为数组有序,说明右侧的数字过大,所以下标左移,故而执行end–
- sum < 0,因为数组有序,说明左侧的数字过小,所以下标右移,所以执行begin++
- 因为两层的遍历时间复杂度为O(n^2),O(n*logn) + O(n^2) = O(n^2),所以总体时间复杂度为O(n^2)