一、 题目描述
在一个N个整数数组里面,有多个奇数和偶数,设计一个排序算法,令所有的奇数都在左边。
请完成sort的代码实现(
void sort(int[]a)
{
…
}
例如: 当输入a = {8,4,1,6,7,4,9,6,4},
a = {1,7,9,8,4,6,4,6,4}为一种满足条件的排序结果。
//测试类
class SingleSort{
public static void main(String[] args) {
int []arr=new int[]{8,4,1,6,7,4,9,6,4};
arr=singleSort(arr);
//输出:[1, 7, 9, 4, 6, 4, 6, 4, 8]
System.out.println(Arrays.toString(arr));
}
//直接按题目要求写的,定义一个临时数组替换,栈的思想
public static int[] singleSort(int []arr){
int[]tmpArr=new int[arr.length];
int i=0,low=0,high=tmpArr.length-1;
while(low<=high){
if(arr[i]%2==1)
tmpArr[low++]=arr[i++];
else
tmpArr[high--]=arr[i++];
}
arr=tmpArr;
return arr;
}
}
二、 题目描述
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,那么该数组中连续的最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
//测试类
class LongestSubArray{
public static void main(String[] args) {
int[]arr=new int[]{1, -2, 3, 10, -4, 7, 2, -5};
int sum=subArray(arr);
//输出18
System.out.println(sum);
}
//定义一个临时变量,元素和大于零相加,小于零舍弃
public static int subArray(int[]arr) {
if(arr==null || arr.length==0)
return 0;
int curr=0,res=0;
for (int i = 0; i < arr.length; i++) {
if(curr<0)
curr=arr[i];
else{
curr+=arr[i];
res=Math.max(res,curr);
}
}
return res;
}
}
三、题目描述
Student(S#,Sname,Sage,Ssex) 学生表,
Course(C#,Cname,T#) 课程表,
SC(S#,C#,score) 成绩表,
Teacher(T#,Tname) 教师表 。
其中,S#代表学生号,C#代表课程号,T#代表教师号。
根据上述描述,请写出如下的查询语句:
1、查询姓“李”的老师的个数;
2、查询没学过“叶平”老师课的同学的学号、姓名;
3、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名。
# 查询姓“李”的老师的个数
SELECT COUNT(Tname) FROM Teacher WHERE Tname like '李%'
# 查询没学过“叶平”老师课的同学的学号、姓名
SELECT `S#`,Sname FROM Student
WHERE `S#` NOT IN
(
SELECT `S#` FROM SC
INNER JOIN Course ON SC.`C#`=Course.`C#`
INNER JOIN Teacher ON Course.`T#`=Teacher.`T#`
WHERE Teacher.`Tname`='叶平'
)
# 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
SELECT Student.`S#`,Student.Sname FROM Student,SC
WHERE Student.`S#`=SC.`S#` AND SC.`C#`='001'AND
EXISTS( SELECT * FROM SC AS SC_2 WHERE SC_2.`S#`=SC.`S#` AND SC_2.`C#`='002');