某大公司的asp程序员机试题,貌似很简单,挑战你的逻辑性

时间:2023-02-12 17:23:02
有00-99共100行,如何用程序实现随机排序。 

要求:
1. 上一行和下一行要首尾呼应;
2. 不可重复出现;
3. 避免死循环;

例:
34
04 
42 
28 
81 
19 
93 
33 
34 
40
00 
07 
72

18 个解决方案

#1



<%
dim i,s(99),r,t
for i=0 to 99
s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
dim i,t
if ubound(arr)<1 then d=arr:exit function
t=replace(","& join(arr,",") &",",","& e &",",",")
d=split(mid(t,2,len(t)-2),",")
end function

'获取含元素数组
function g(arr,e)
dim i,t
redim t(-1)
for i=0 to ubound(arr)
if mid(arr(i),1,1)=mid(e,2,1) then
redim preserve t(ubound(t)+1)
t(ubound(t))=arr(i)
end if
next
g=t
end function

'随机获取元素
sub p(arr,e)
dim tarr,i
if e="" then
tarr=arr
else
tarr=g(arr,e)
end if
Randomize
if ubound(tarr)>-1 then
i=int((ubound(tarr)+1)*rnd)
if not isarray(r) then
t=s
redim r(0)
r(0)=tarr(i)
t=d(t,tarr(i))
else
redim preserve r(ubound(r)+1)
r(ubound(r))=tarr(i)
t=d(t,tarr(i))
end if
call p(t,tarr(i))
end if
end sub

call p(s,"")
response.write join(r,",")
response.write "<br>("& ubound(r)+1 &")"%>

有时候报错,原因待查

#2


楼上的无法每次都把100个数完全排列出来。

#3


引用 1 楼 gingerkang 的回复:
VBScript code
<%
dim i,s(99),r,t
for i=0 to 99
    s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
    dim i,t
    if ubound(arr)<1 then d=arr:exit function
    t=replace(","& join(arr,",") &",",","& e &",",",")
    d=split(mid(t,2,len(t)-2),",")
end function

'获取含元素数组
function g(arr,e)
    dim i,t
    redim t(-1)
    for i=0 to ubound(arr)
        if mid(arr(i),1,…

没有大致的看你程序 

不过 是否考虑了
比如 取  57 74 47
当把所有7取出来的时候
27 17 47 67 == 就应该全部删除掉 那些数组元素
才不会错误~

代码就不写了
下班了

#4


引用 2 楼 Novolee 的回复:
楼上的无法每次都把100个数完全排列出来。

那是当然  
比如 我取
10 02 20 03.。。。
把所有0 取出来 就没有了
就删 把所有 带0全部删除

不然就出错 所以 第3个条件就是不要死循环
问题也没说一定要显示所有的


1. 上一行和下一行要首尾呼应; 
2. 不可重复出现; 
3. 避免死循环; 

#5


生成一个数组,然后对数组进行操作.

#6


删除元素,在只有1个的时候处理不当,现更正如下,好像没错了
思路是一组数取出一个后再在剩下的这组数中继续取

<%
Option Explicit

dim i,s(99),r,t
for i=0 to 99
s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
dim i,t
if ubound(arr)<0 then d=arr:exit function
t=replace(","& join(arr,",") &",",","& e &",",",")
if len(t)>2 then
t=split(mid(t,2,len(t)-2),",")
else
redim t(-1)
end if
d=t
end function

'获取含元素数组
function g(arr,e)
dim i,t
redim t(-1)
for i=0 to ubound(arr)
if mid(arr(i),1,1)=mid(e,2,1) then
redim preserve t(ubound(t)+1)
t(ubound(t))=arr(i)
end if
next
g=t
end function

'随机获取元素
sub p(arr,e)
dim tarr,i
if e="" then
tarr=arr
else
tarr=g(arr,e)
end if
Randomize
if ubound(tarr)>-1 then
i=int((ubound(tarr)+1)*rnd)
if not isarray(r) then
t=s
redim r(0)
r(0)=tarr(i)
t=d(t,tarr(i))
else
redim preserve r(ubound(r)+1)
r(ubound(r))=tarr(i)
t=d(t,tarr(i))
end if
call p(t,tarr(i))
end if
end sub

call p(s,"")
response.write join(r,",")
response.write "<br>("& ubound(r)+1 &")"
%>

#7


还有更好的算法吗?

#8


我想的是用两个二维数组,第一个表示的是十位数,第二个表示的是个位数.
如果是42,分别从两个数组中删除.删除第一个数组中第2列的4和删除第二个数组中第4行的2.
首尾相连,个位数删除之前赋值给一个变量就行了。 
dim a(9,9) 
dim b(9,9)
第二个数组是第一个数组的置换.学C时候有点印象,好象是叫置换吧.就是行列置换.
具体的代码偶目前基本不会,就是想了想有点思路了。
不知是否可行.

#9


这是排列组合吧,要排列完整出来非常耗费时间,随机排序,能排满100个的概率相当低,刚才排列几十次了,才排列出这组完全数字,其余的排列都是未完成就中断了,不要说随机,就是给一个任意的0-99之间的数,让你排列出首尾相连的数字,ASP也是很难完成的
完整的排列如下(纯粹是瞎猫碰上了死耗子,才算出这组数):
07,78,88,84,46,62,22,21,12,24,
41,13,34,40,04,47,70,02,29,93,
31,16,60,03,37,79,96,66,68,86,
69,95,54,44,43,35,59,91,19,97,
71,18,83,38,87,77,75,52,27,72,
26,61,17,74,42,28,82,20,01,10,
06,67,73,33,36,65,55,56,64,45,
57,76,63,30,09,94,49,90,05,51,
14,48,81,11,15,58,80,00,08,89,
98,85,53,32,23,39,99,92,25,50

代码如下:

Dim tmp(1, 99)'临时数组
Dim flag(9)'十位数的数字个数标记
Dim i, k, j
For i = 0 To 9
    flag(i) = 0
Next

Randomize

For i = 0 To UBound(tmp, 2)
    If i = 0 Then
        k = Int(Rnd * 10)'十位
        j = Int(Rnd * 10)'个位
        flag(k) = flag(k) + 1
    Else
        j = Int(Rnd * 10)
        Do While ArrayExists(tmp, k, j)
            j = Int(Rnd * 10)
        Loop
        flag(j) = flag(j) + 1
    End If
    tmp(0, i) = k
    tmp(1, i) = j
    k = j'下个数字的十位用上个数字的个位
    If flag(k) = 10 Then Exit For'当相同10位数的个数为10,则退出循环
Next
For i = 0 To UBound(tmp, 2)
    Response.Write i & "-" & tmp(0, i) & tmp(1, i) & "<br/>"
Next

'检测数字是否已存在与数组中
Private Function ArrayExists(arr, x, y)
    Dim i
    For i = 0 To UBound(arr, 2)
        If IsEmpty(arr(0, i)) Or IsEmpty(arr(1, i)) Then
            Exit For
        ElseIf arr(0, i) = x And arr(1, i) = y Then
            ArrayExists = True
            Exit Function
        End If
    Next
    ArrayExists = False
End Function

#10


要排出来不难,关键是要让程序每次运行都能得到一个正确的就难了。

#11


引用 6 楼 gingerkang 的回复:
删除元素,在只有1个的时候处理不当,现更正如下,好像没错了 
思路是一组数取出一个后再在剩下的这组数中继续取 

VBScript code
<%
Option Explicit

dim i,s(99),r,t
for i=0 to 99
    s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
    dim i,t
    if ubound(arr)<0 then d=arr:exit function
    t=replace(","& join(arr,",") &",",","& e &",",",")
    if len(t)>2 then
        t=split(mid(t…

#12


好象是的,我写了几个,看语句应该没问题,但显示就不对

#13


我觉得可以这样看。
首先第一个数字等于最后一个数字比如开始是4*,最后一个一定是*4
那么我们把这200个数字从头到位接起来我们可以看到100对一样的数字。
现在我们把两个相邻并且相等的看作一个数字,可以发现100个数字其实是0~9各10个
ok现在拿出10个0~9的数,剩下的就看你们的了

#14


学习下

#15


很好,学习中

#16


建议用回溯法试试!

#17


<%
dim numbers
dim lines
dim onenum1
dim onenum2
onenum1=""
onenum2=""
randomize
onenum1=int(((9-0)+1)*rnd+0)
randomize
onenum2=int(((9-0)+1)*rnd+0)
lines=onenum1&onenum2
numbers=lines&";"
response.Write(lines&"<br>")
for i=0 to 99
randomize
onenum1=onenum2
randomize
onenum2=int(((9-0)+1)*rnd+0)
lines=onenum1&onenum2
if instr(numbers,lines)>0 then
temp=onenum2
for j=-9 to 9
onenum2=temp+j
if onenum2>9 then
onenum2=9
end if
if onenum2<0 then
onenum2=0
end if
lines=onenum1&onenum2
if instr(numbers,lines)>0 then
else
numbers=numbers&lines&";"
response.Write(lines&"<br>")
exit for
End if
Next
else
numbers=numbers&lines&";"
response.Write(lines&"<br>")
end if
Next
%>
看看啊!不知道这算不算随机!

#18


我明明给分结贴了,怎么得分都是0呢?

#1



<%
dim i,s(99),r,t
for i=0 to 99
s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
dim i,t
if ubound(arr)<1 then d=arr:exit function
t=replace(","& join(arr,",") &",",","& e &",",",")
d=split(mid(t,2,len(t)-2),",")
end function

'获取含元素数组
function g(arr,e)
dim i,t
redim t(-1)
for i=0 to ubound(arr)
if mid(arr(i),1,1)=mid(e,2,1) then
redim preserve t(ubound(t)+1)
t(ubound(t))=arr(i)
end if
next
g=t
end function

'随机获取元素
sub p(arr,e)
dim tarr,i
if e="" then
tarr=arr
else
tarr=g(arr,e)
end if
Randomize
if ubound(tarr)>-1 then
i=int((ubound(tarr)+1)*rnd)
if not isarray(r) then
t=s
redim r(0)
r(0)=tarr(i)
t=d(t,tarr(i))
else
redim preserve r(ubound(r)+1)
r(ubound(r))=tarr(i)
t=d(t,tarr(i))
end if
call p(t,tarr(i))
end if
end sub

call p(s,"")
response.write join(r,",")
response.write "<br>("& ubound(r)+1 &")"%>

有时候报错,原因待查

#2


楼上的无法每次都把100个数完全排列出来。

#3


引用 1 楼 gingerkang 的回复:
VBScript code
<%
dim i,s(99),r,t
for i=0 to 99
    s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
    dim i,t
    if ubound(arr)<1 then d=arr:exit function
    t=replace(","& join(arr,",") &",",","& e &",",",")
    d=split(mid(t,2,len(t)-2),",")
end function

'获取含元素数组
function g(arr,e)
    dim i,t
    redim t(-1)
    for i=0 to ubound(arr)
        if mid(arr(i),1,…

没有大致的看你程序 

不过 是否考虑了
比如 取  57 74 47
当把所有7取出来的时候
27 17 47 67 == 就应该全部删除掉 那些数组元素
才不会错误~

代码就不写了
下班了

#4


引用 2 楼 Novolee 的回复:
楼上的无法每次都把100个数完全排列出来。

那是当然  
比如 我取
10 02 20 03.。。。
把所有0 取出来 就没有了
就删 把所有 带0全部删除

不然就出错 所以 第3个条件就是不要死循环
问题也没说一定要显示所有的


1. 上一行和下一行要首尾呼应; 
2. 不可重复出现; 
3. 避免死循环; 

#5


生成一个数组,然后对数组进行操作.

#6


删除元素,在只有1个的时候处理不当,现更正如下,好像没错了
思路是一组数取出一个后再在剩下的这组数中继续取

<%
Option Explicit

dim i,s(99),r,t
for i=0 to 99
s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
dim i,t
if ubound(arr)<0 then d=arr:exit function
t=replace(","& join(arr,",") &",",","& e &",",",")
if len(t)>2 then
t=split(mid(t,2,len(t)-2),",")
else
redim t(-1)
end if
d=t
end function

'获取含元素数组
function g(arr,e)
dim i,t
redim t(-1)
for i=0 to ubound(arr)
if mid(arr(i),1,1)=mid(e,2,1) then
redim preserve t(ubound(t)+1)
t(ubound(t))=arr(i)
end if
next
g=t
end function

'随机获取元素
sub p(arr,e)
dim tarr,i
if e="" then
tarr=arr
else
tarr=g(arr,e)
end if
Randomize
if ubound(tarr)>-1 then
i=int((ubound(tarr)+1)*rnd)
if not isarray(r) then
t=s
redim r(0)
r(0)=tarr(i)
t=d(t,tarr(i))
else
redim preserve r(ubound(r)+1)
r(ubound(r))=tarr(i)
t=d(t,tarr(i))
end if
call p(t,tarr(i))
end if
end sub

call p(s,"")
response.write join(r,",")
response.write "<br>("& ubound(r)+1 &")"
%>

#7


还有更好的算法吗?

#8


我想的是用两个二维数组,第一个表示的是十位数,第二个表示的是个位数.
如果是42,分别从两个数组中删除.删除第一个数组中第2列的4和删除第二个数组中第4行的2.
首尾相连,个位数删除之前赋值给一个变量就行了。 
dim a(9,9) 
dim b(9,9)
第二个数组是第一个数组的置换.学C时候有点印象,好象是叫置换吧.就是行列置换.
具体的代码偶目前基本不会,就是想了想有点思路了。
不知是否可行.

#9


这是排列组合吧,要排列完整出来非常耗费时间,随机排序,能排满100个的概率相当低,刚才排列几十次了,才排列出这组完全数字,其余的排列都是未完成就中断了,不要说随机,就是给一个任意的0-99之间的数,让你排列出首尾相连的数字,ASP也是很难完成的
完整的排列如下(纯粹是瞎猫碰上了死耗子,才算出这组数):
07,78,88,84,46,62,22,21,12,24,
41,13,34,40,04,47,70,02,29,93,
31,16,60,03,37,79,96,66,68,86,
69,95,54,44,43,35,59,91,19,97,
71,18,83,38,87,77,75,52,27,72,
26,61,17,74,42,28,82,20,01,10,
06,67,73,33,36,65,55,56,64,45,
57,76,63,30,09,94,49,90,05,51,
14,48,81,11,15,58,80,00,08,89,
98,85,53,32,23,39,99,92,25,50

代码如下:

Dim tmp(1, 99)'临时数组
Dim flag(9)'十位数的数字个数标记
Dim i, k, j
For i = 0 To 9
    flag(i) = 0
Next

Randomize

For i = 0 To UBound(tmp, 2)
    If i = 0 Then
        k = Int(Rnd * 10)'十位
        j = Int(Rnd * 10)'个位
        flag(k) = flag(k) + 1
    Else
        j = Int(Rnd * 10)
        Do While ArrayExists(tmp, k, j)
            j = Int(Rnd * 10)
        Loop
        flag(j) = flag(j) + 1
    End If
    tmp(0, i) = k
    tmp(1, i) = j
    k = j'下个数字的十位用上个数字的个位
    If flag(k) = 10 Then Exit For'当相同10位数的个数为10,则退出循环
Next
For i = 0 To UBound(tmp, 2)
    Response.Write i & "-" & tmp(0, i) & tmp(1, i) & "<br/>"
Next

'检测数字是否已存在与数组中
Private Function ArrayExists(arr, x, y)
    Dim i
    For i = 0 To UBound(arr, 2)
        If IsEmpty(arr(0, i)) Or IsEmpty(arr(1, i)) Then
            Exit For
        ElseIf arr(0, i) = x And arr(1, i) = y Then
            ArrayExists = True
            Exit Function
        End If
    Next
    ArrayExists = False
End Function

#10


要排出来不难,关键是要让程序每次运行都能得到一个正确的就难了。

#11


引用 6 楼 gingerkang 的回复:
删除元素,在只有1个的时候处理不当,现更正如下,好像没错了 
思路是一组数取出一个后再在剩下的这组数中继续取 

VBScript code
<%
Option Explicit

dim i,s(99),r,t
for i=0 to 99
    s(i)=mid(100+i,2)
next

'删除元素
function d(arr,e)
    dim i,t
    if ubound(arr)<0 then d=arr:exit function
    t=replace(","& join(arr,",") &",",","& e &",",",")
    if len(t)>2 then
        t=split(mid(t…

#12


好象是的,我写了几个,看语句应该没问题,但显示就不对

#13


我觉得可以这样看。
首先第一个数字等于最后一个数字比如开始是4*,最后一个一定是*4
那么我们把这200个数字从头到位接起来我们可以看到100对一样的数字。
现在我们把两个相邻并且相等的看作一个数字,可以发现100个数字其实是0~9各10个
ok现在拿出10个0~9的数,剩下的就看你们的了

#14


学习下

#15


很好,学习中

#16


建议用回溯法试试!

#17


<%
dim numbers
dim lines
dim onenum1
dim onenum2
onenum1=""
onenum2=""
randomize
onenum1=int(((9-0)+1)*rnd+0)
randomize
onenum2=int(((9-0)+1)*rnd+0)
lines=onenum1&onenum2
numbers=lines&";"
response.Write(lines&"<br>")
for i=0 to 99
randomize
onenum1=onenum2
randomize
onenum2=int(((9-0)+1)*rnd+0)
lines=onenum1&onenum2
if instr(numbers,lines)>0 then
temp=onenum2
for j=-9 to 9
onenum2=temp+j
if onenum2>9 then
onenum2=9
end if
if onenum2<0 then
onenum2=0
end if
lines=onenum1&onenum2
if instr(numbers,lines)>0 then
else
numbers=numbers&lines&";"
response.Write(lines&"<br>")
exit for
End if
Next
else
numbers=numbers&lines&";"
response.Write(lines&"<br>")
end if
Next
%>
看看啊!不知道这算不算随机!

#18


我明明给分结贴了,怎么得分都是0呢?