被老板炒了?被马子甩了?被C罗涮了?被李刚撞了?喝酒伤身,来做题发泄吧。

guguda2008 2010-12-01 12:06:49
加精
刚上论坛,看到一行变绿了的字
横空出世,席卷Csdn:记微软等100题系列数次被荐
进去一看,乖乖,所有公司的面试算法题都是从这里来的?那就做呗,反正打游戏也是玩,做题也是玩,别的公司总不会因为你游戏玩的好招你当高层的,我打算有空了想玩游戏了就一道一道做,管它做的对不对呢,好歹也算见过这题了。

在SQL版,当然要用SQL来解,T-SQL应该也算门语言对吧。

废话少说,第一题开始:
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。

10
/ \
6 14
/ \ / \
4 8 12 16

转换成双向链表
4=6=8=10=12=14=16。

首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};

我用了个取巧的办法,直接UPDATE+子查询了,反正最后就是要排序对吧,从大到小排出来就对了。。。TOP 1+ORDER BY解决战斗。。。。。。。

IF OBJECT_ID('TreeNode') IS NOT NULL DROP TABLE TreeNode
GO
CREATE TABLE TREENODE (
ID INT NOT NULL UNIQUE
,VAL INT
,LID INT
,RID INT
)
/*
10
/ \
6 14
/ \ / \
4 8 12 16
*/
INSERT INTO TREENODE
SELECT 10,10,6,14 UNION ALL
SELECT 6,6,4,8 UNION ALL
SELECT 14,14,12,16 UNION ALL
SELECT 4,4,NULL,NULL UNION ALL
SELECT 8,8,NULL,NULL UNION ALL
SELECT 12,12,NULL,NULL UNION ALL
SELECT 16,16,NULL,NULL

SELECT * FROM TREENODE
/*
ID VAL LID RID
----------- ----------- ----------- -----------
10 10 6 14
6 6 4 8
14 14 12 16
4 4 NULL NULL
8 8 NULL NULL
12 12 NULL NULL
16 16 NULL NULL
*/

UPDATE T1 SET
LID=(SELECT TOP 1 ID FROM TREENODE T2 WHERE T2.VAL<T1.VAL ORDER BY VAL DESC)
,RID=(SELECT TOP 1 ID FROM TREENODE T2 WHERE T2.VAL>T1.VAL ORDER BY VAL ASC)
FROM TREENODE T1

SELECT * FROM TREENODE ORDER BY ID
/*
ID VAL LID RID
----------- ----------- ----------- -----------
4 4 NULL 6
6 6 4 8
8 8 6 10
10 10 8 12
12 12 10 14
14 14 12 16
16 16 14 NULL
*/
...全文
1209 94 打赏 收藏 转发到动态 举报
写回复
用AI写文章
94 条回复
切换为时间正序
请发表友善的回复…
发表回复
huazhuaz 2010-12-02
  • 打赏
  • 举报
回复
让我如何是好啊
做鸡真好吃 2010-12-02
  • 打赏
  • 举报
回复
Y被踢了
fffyrnr 2010-12-02
  • 打赏
  • 举报
回复
脑袋乱码处理中
johnson-ji 2010-12-02
  • 打赏
  • 举报
回复
学习下
ym_pang_pang 2010-12-02
  • 打赏
  • 举报
回复
膜拜下强人
ximenziplc 2010-12-02
  • 打赏
  • 举报
回复
内容智慧,题目智慧+艺术 ,好
ximenziplc 2010-12-02
  • 打赏
  • 举报
回复
题目智慧,内容也智慧,一个字,好
birdmonster 2010-12-02
  • 打赏
  • 举报
回复


第六题用列来做
CREATE TABLE #TB(NUM INT,SUMNUM INT)
DECLARE @I INT
SELECT @I=0
while @I<10
BEGIN
INSERT INTO #TB VALUES(@I,0)
SELECT @I=@I+1
END


WHILE exists(SELECT b.num FROM #TB B where SUMNUM<>(SELECT COUNT(*) FROM #TB A where A.sumnum=b.num))
BEGIN
DECLARE @NUM INT
DECLARE CUR CURSOR FOR SELECT NUM FROM #TB
OPEN CUR
FETCH NEXT FROM CUR INTO @NUM
WHILE @@fetch_status=0
BEGIN
UPDATE #TB SET SUMNUM=(SELECT COUNT(*) FROM #TB A WHERE A.SUMNUM=B.NUM) FROM #TB B WHERE B.NUM=@NUM
FETCH NEXT FROM CUR INTO @NUM
END
CLOSE CUR
DEALLOCATE CUR
END

SELECT * FROM #TB

DROP TABLE #TB
百年树人 2010-12-02
  • 打赏
  • 举报
回复
为摧毁3连而来
guguda2008 2010-12-02
  • 打赏
  • 举报
回复
第6题
------------------------------------
腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】

初看此题,貌似很难,10分钟过去了,可能有的人,题目都还没看懂。

举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..

恩。。没什么好思路,用穷举法写的,谁有好的思路,提供一下。。。。。
下面的条件是用代码生成的,本来想帖动态写法的,考虑到帖子长一点比较V5,就把生成的代码帖出来了。

DECLARE @N1 INT,@N2 INT,@N3 INT,@N4 INT,@N5 INT,@N6 INT,@N7 INT,@N8 INT,@N9 INT,@N10 INT
SELECT @N1=0,@N2=1,@N3=2,@N4=3,@N5=4,@N6=5,@N7=6,@N8=7,@N9=8,@N10=9
;WITH MU AS (
SELECT @N1 AS NUM UNION ALL
SELECT @N2 UNION ALL
SELECT @N3 UNION ALL
SELECT @N4 UNION ALL
SELECT @N5 UNION ALL
SELECT @N6 UNION ALL
SELECT @N7 UNION ALL
SELECT @N8 UNION ALL
SELECT @N9 UNION ALL
SELECT @N10
)
SELECT @N1,@N2,@N3,@N4,@N5,@N6,@N7,@N8,@N9,@N10 UNION ALL
SELECT
T1.NUM,T2.NUM,T3.NUM,T4.NUM,T5.NUM,T6.NUM,T7.NUM,T8.NUM,T9.NUM,T10.NUM
FROM MU T1
INNER JOIN MU T2 ON T1.NUM+T2.NUM<=10
INNER JOIN MU T3 ON T1.NUM+T2.NUM+T3.NUM<=10
INNER JOIN MU T4 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM<=10
INNER JOIN MU T5 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM<=10
INNER JOIN MU T6 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM+T6.NUM<=10
INNER JOIN MU T7 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM+T6.NUM+T7.NUM<=10
INNER JOIN MU T8 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM+T6.NUM+T7.NUM+T8.NUM<=10
INNER JOIN MU T9 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM+T6.NUM+T7.NUM+T8.NUM+T9.NUM<=10
INNER JOIN MU T10 ON T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM+T6.NUM+T7.NUM+T8.NUM+T9.NUM+T10.NUM<=10
WHERE T1.NUM+T2.NUM+T3.NUM+T4.NUM+T5.NUM+T6.NUM+T7.NUM+T8.NUM+T9.NUM+T10.NUM=10
AND T1.NUM=(
CASE WHEN T1.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N1 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N1 THEN 1 ELSE 0 END
)AND T2.NUM=(
CASE WHEN T1.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N2 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N2 THEN 1 ELSE 0 END
)AND T3.NUM=(
CASE WHEN T1.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N3 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N3 THEN 1 ELSE 0 END
)AND T4.NUM=(
CASE WHEN T1.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N4 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N4 THEN 1 ELSE 0 END
)AND T5.NUM=(
CASE WHEN T1.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N5 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N5 THEN 1 ELSE 0 END
)AND T6.NUM=(
CASE WHEN T1.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N6 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N6 THEN 1 ELSE 0 END
)AND T7.NUM=(
CASE WHEN T1.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N7 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N7 THEN 1 ELSE 0 END
)AND T8.NUM=(
CASE WHEN T1.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N8 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N8 THEN 1 ELSE 0 END
)AND T9.NUM=(
CASE WHEN T1.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N9 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N9 THEN 1 ELSE 0 END
)AND T10.NUM=(
CASE WHEN T1.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T2.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T3.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T4.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T5.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T6.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T7.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T8.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T9.NUM=@N10 THEN 1 ELSE 0 END
+CASE WHEN T10.NUM=@N10 THEN 1 ELSE 0 END
)
/*
0 1 2 3 4 5 6 7 8 9
6 2 1 0 0 0 1 0 0 0
*/


小猫阿尤 2010-12-02
  • 打赏
  • 举报
回复
学习。。。
huminghua 2010-12-02
  • 打赏
  • 举报
回复
我帮你!@
guguda2008 2010-12-02
  • 打赏
  • 举报
回复
5.查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

这个不写了。。。。。SELECT TOP (N) ORDER BY COL ASC行了
如果是程序语言的话MS应该用冒泡排个序?也没啥意思
guguda2008 2010-12-02
  • 打赏
  • 举报
回复
4.在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。

二元树节点的数据结构定义为:

struct BinaryTreeNode // a node in the binary tree
{
int m_nValue; // value of node
BinaryTreeNode *m_pLeft; // left child of node
BinaryTreeNode *m_pRight; // right child of node
};

这次没规定时间复杂度了,搞不定BOM还在MSSQL版混什么,CTE万岁嘎嘎嘎嘎嘎

IF OBJECT_ID('TreeNode') IS NOT NULL DROP TABLE TreeNode
GO
CREATE TABLE TREENODE (
ID INT NOT NULL UNIQUE
,VAL INT
,LID INT
,RID INT
)
/*
10
/ \
5 12
/ \
4 7
*/
INSERT INTO TREENODE
SELECT 10,10,5,12 UNION ALL
SELECT 5,5,4,7 UNION ALL
SELECT 12,12,NULL,NULL UNION ALL
SELECT 4,4,NULL,NULL UNION ALL
SELECT 7,7,NULL,NULL
DECLARE @NUM INT
SET @NUM=22
;WITH MU AS (
SELECT ID,VAL,LID,RID,VAL AS SUMVAL,1 AS LEVEL,NULL AS PARIENTID
FROM TREENODE T1
UNION ALL
SELECT T1.ID,T1.VAL,T1.LID,T1.RID,T1.VAL+T2.SUMVAL,LEVEL+1,T2.ID AS PARIENTID
FROM TREENODE T1
INNER JOIN MU T2 ON T1.ID=T2.LID OR T1.ID=T2.RID
),MU2 AS (
SELECT *,CONVERT(VARCHAR(MAX),ID) AS [PATH] FROM MU WHERE SUMVAL=22
UNION ALL
SELECT T1.*,LTRIM(T1.ID)+'-'+T2.[PATH]
FROM MU T1
INNER JOIN MU2 T2 ON T1.ID=T2.PARIENTID AND T1.LEVEL=T2.LEVEL-1
)
SELECT PATH FROM MU2 WHERE LEVEL=1
/*
10-5-7
10-12
*/
guguda2008 2010-12-02
  • 打赏
  • 举报
回复
3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

这个题 ,没思路,按答案写的实现方法,为什么这样能实现还在看
这个是用CTE实现的,实际用UPDATE也可以,写法上不同而已。

IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(
ID INT IDENTITY(1,1)
,VAL INT
)
INSERT INTO TB
SELECT 1 UNION ALL SELECT -2 UNION ALL SELECT 3 UNION ALL SELECT 10 UNION ALL SELECT -4
UNION ALL SELECT 7 UNION ALL SELECT 2 UNION ALL SELECT -5
;WITH MU AS (
SELECT ID,VAL,VAL AS TEMPVAL ,VAL AS SUMVAL
FROM TB WHERE ID=1
UNION ALL
SELECT T1.ID,T1.VAL
,CASE WHEN T2.TEMPVAL<0 THEN T1.VAL ELSE T1.VAL+T2.TEMPVAL END
,CASE WHEN
CASE WHEN T2.TEMPVAL<0 THEN T1.VAL ELSE T1.VAL+T2.TEMPVAL END
>T2.SUMVAL THEN CASE WHEN T2.TEMPVAL<0 THEN T1.VAL ELSE T1.VAL+T2.TEMPVAL END
ELSE T2.SUMVAL END
FROM TB T1
INNER JOIN MU T2 ON T1.ID=T2.ID+1
)

SELECT TOP 1 SUMVAL FROM MU
ORDER BY ID DESC
--18

guguda2008 2010-12-01
  • 打赏
  • 举报
回复
第一题做的不好,有好思路的童鞋再写一个吧,我那个里面没算法的。。。。
guguda2008 2010-12-01
  • 打赏
  • 举报
回复
2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。

我的解法,加了一列。
我只用了索引的排序功能,没用统计信息,应该不算犯规吧。。。。
IF OBJECT_ID('MYSTACK') IS NOT NULL DROP TABLE MYSTACK
GO
CREATE TABLE MYSTACK(
ID INT IDENTITY(1,1)
,VAL INT
,MINVAL INT
,PRIMARY KEY(
ID DESC
)
)
GO
IF OBJECT_ID('MYPUSH') IS NOT NULL DROP PROCEDURE MYPUSH
GO
CREATE PROCEDURE MYPUSH(@VAL INT)
AS
BEGIN
DECLARE @MINVAL INT
SELECT TOP 1 @MINVAL=VAL FROM MYSTACK
INSERT INTO MYSTACK(VAL,MINVAL)
SELECT @VAL,CASE WHEN @VAL<@MINVAL OR @MINVAL IS NULL THEN @VAL ELSE @MINVAL END
END
GO
IF OBJECT_ID('MYPOP') IS NOT NULL DROP PROCEDURE MYPOP
GO
CREATE PROCEDURE MYPOP
AS
BEGIN
DECLARE @NOWID INT,@NOWVAL INT
SELECT TOP 1 @NOWID=ID,@NOWVAL=VAL FROM MYSTACK
DELETE FROM MYSTACK WHERE ID=@NOWID
SELECT @NOWVAL
END
GO
IF OBJECT_ID('MYMIN') IS NOT NULL DROP PROCEDURE MYMIN
GO
CREATE PROCEDURE MYMIN
AS
BEGIN
SELECT TOP 1 MINVAL FROM MYSTACK
END
GO
MYPUSH 7
GO
MYPUSH 4
GO
MYPUSH 5
GO
SELECT * FROM MYSTACK
GO
MYMIN
GO
MYPOP
GO
MYPOP
GO
MYMIN
GO
散步的阿木 2010-12-01
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
kevn 2010-12-01
  • 打赏
  • 举报
回复
来10分
guoqu1989 2010-12-01
  • 打赏
  • 举报
回复
加载更多回复(71)

11,848

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧