1。有1,2,2,3,4,5六个数,要求输出他们组合的全排列,4不能在第三位,5和3不能相邻
2。考勤表id(PK int) name(varchar) time(datetime),求迟到次数最多的员工的最后一次迟到时间
看到一个帖子上的面试题 我是真算不出了
麻烦高手帮忙讲讲

解决方案 »

  1.   

    sql还好说
    那个排列的真麻烦
    先不用加条件 就把所有可能出现的排序写出来就ok
      

  2.   

    public class Test3 {   
        // 当前固定部分   
        private String CurFixPart;   
      
        private String PreGenNum;   
      
        public static void main(String[] args) {   
            Test3 t = new Test3();   
            t.GenControll("123456");   
        }   
      
        // 调整字符串s位置pos字符到最前   
        private String shift(String s, int pos) {   
            String newStr;   
            if (s.length() > pos + 1)   
                newStr = s.substring(pos, pos + 1) + s.substring(0, pos)   
                        + s.substring(pos + 1);   
            else  
                newStr = s.substring(pos) + s.substring(0, pos);   
            return newStr;   
        }   
      
        private int Validate(String newNum) {   
            String newGenNum = CurFixPart + newNum;   
            if (Integer.valueOf(newGenNum) <= Integer.valueOf(PreGenNum))   
                return 0;   
            if (newGenNum.substring(2, 3).equals("4")   
                    || (newGenNum.indexOf("35") != -1)   
                    || (newGenNum.indexOf("53") != -1))   
                return 0;   
      
            PreGenNum = newGenNum;   
            System.out.println("----"+newGenNum);   
             
            return 0;   
        }   
      
     public void GenControll(String Base) {   
            PreGenNum = "0";   
            CurFixPart = "";   
            GenNext(Base, 0);   
        }   
      
        public void GenNext(String varPart, int curPos) {   
            if (varPart.length() == 2) {   
                Validate(varPart);   
                Validate(shift(varPart, 1));   
                return;   
            }   
            // Next Layer   
            String newGen = shift(varPart, curPos);   
            String SavedFixPart = CurFixPart;   
            CurFixPart = CurFixPart + newGen.substring(0, 1);   
            GenNext(newGen.substring(1), 0);   
            CurFixPart = SavedFixPart;   
            // 同层递增   
            if (curPos == varPart.length() - 1)   
                return;   
            GenNext(varPart, curPos + 1);   
               
        }   
      

  3.   

    第一题:把全排列放进一个hastable中,然后循环,remove.compareto("53")
    remove.compareto("4")
      

  4.   

    第2道:
    select top 1 time from test where name =
    (select top 1 name from test group by name order by count(*) desc)
    order by time desc
      

  5.   

    select top 1 time
    from test
    where name in(select name
                  from test
                  group by name
                  having count(time)>=all(select count(time)
                                          from test
                                          group by name))
    order by time desc
      

  6.   


        Sub Main()        Dim d As New List(Of String)
            Dim num() As Integer = {1, 2, 2, 3, 4, 5}
            For i1 = 0 To 5
                For i2 = 0 To 5
                    If i2 = i1 Then Continue For
                    If num(i2) = 5 And num(i1) = 3 Then Continue For
                    If num(i2) = 3 And num(i1) = 1 Then Continue For
                    For i3 = 0 To 5
                        If i3 = i1 OrElse i3 = i2 Then Continue For
                        If num(i3) = 4 Then Continue For
                        If num(i3) = 5 And num(i2) = 3 Then Continue For
                        If num(i3) = 3 And num(i2) = 5 Then Continue For
                        For i4 = 0 To 5
                            If i4 = i1 OrElse i4 = i2 OrElse i4 = i3 Then Continue For
                            If num(i4) = 5 And num(i3) = 3 Then Continue For
                            If num(i4) = 3 And num(i3) = 5 Then Continue For
                            For i5 = 0 To 5
                                If i5 = i1 OrElse i5 = i2 OrElse i5 = i3 OrElse i5 = i4 Then Continue For
                                If num(i5) = 5 And num(i4) = 3 Then Continue For
                                If num(i5) = 3 And num(i4) = 5 Then Continue For
                                For i6 = 0 To 5
                                    If i6 = i1 OrElse i6 = i2 OrElse i6 = i3 OrElse i6 = i4 OrElse i6 = i5 Then Continue For
                                    If num(i6) = 5 And num(i5) = 3 Then Continue For
                                    If num(i6) = 3 And num(i5) = 5 Then Continue For
                                    Console.WriteLine(String.Format("{0}-{1}-{2}-{3}-{4}-{5}", num(i1), num(i2), num(i3), num(i4), num(i5), num(i6)))                            Next
                            Next
                        Next
                    Next
                Next
            Next    End Sub
      

  7.   

    如果条件复杂多变的话    Sub Main()        Dim d As New List(Of String)
            Dim num() As Integer = {1, 2, 2, 3, 4, 5}
            For i1 = 0 To 5
                For i2 = 0 To 5
                    If i2 = i1 Then Continue For
                    For i3 = 0 To 5
                        If i3 = i1 OrElse i3 = i2 Then Continue For
                        For i4 = 0 To 5
                            If i4 = i1 OrElse i4 = i2 OrElse i4 = i3 Then Continue For
                            For i5 = 0 To 5
                                If i5 = i1 OrElse i5 = i2 OrElse i5 = i3 OrElse i5 = i4 Then Continue For
                                For i6 = 0 To 5
                                    If i6 = i1 OrElse i6 = i2 OrElse i6 = i3 OrElse i6 = i4 OrElse i6 = i5 Then Continue For                                d.Add(String.Format("{0}-{1}-{2}-{3}-{4}-{5}", num(i1), num(i2), num(i3), num(i4), num(i5), num(i6)))                            Next
                            Next
                        Next
                    Next
                Next
            Next        d.AsParallel.Where(Function(s) s(7) <> "4"c And s.IndexOf("3-5") = -1 And s.IndexOf("5-3") = -1).ForAll(Sub(s)
                                                                                                                        Console.WriteLine(s)
                                                                                                                    End Sub)
        End Sub