常见的伪代码问题,难题和挑战

时间:2010-08-15 10:54:18

标签: language-agnostic pseudocode

我正在寻找您可能在面试中被问到或被要求代表您的工作或教育的伪代码问题的示例。我不是特别想从任何领域寻找示例,因此它可能与设计模式,算法,数据结构,缓存策略,与软件工程和开发有关的任何事情都很简单或复杂。

例如,我发现的一些常见的主要与排序和搜索技术有关:

Bubblesort

procedure bubbleSort( A : list of sortable items ) defined as:
  do
    swapped := false
    for each i in 0 to length(A) - 2 inclusive do:
      if A[i] > A[i+1] then
        swap( A[i], A[i+1] )
        swapped := true
      end if
    end for
  while swapped
end procedure

Insertion sort

insertionSort(array A)
begin
    for i := 1 to length[A]-1 do
    begin
        value := A[i];
        j := i - 1;
        done := false;
        repeat
            if A[j] > value then
            begin
                A[j + 1] := A[j];
                j := j - 1;
                if j < 0 then
                    done := true;
            end
            else
                done := true;
        until done;
        A[j + 1] := value;
    end;
end;

Binary search

   BinarySearch(A[0..N-1], value, low, high) {
       if (high < low)
           return -1 // not found
       mid = low + ((high - low) / 2)
       if (A[mid] > value)
           return BinarySearch(A, value, low, mid-1)
       else if (A[mid] < value)
           return BinarySearch(A, value, mid+1, high)
       else
           return mid // found
   }

如果很多人分享他们的想法和经验,我们或许可以建立一个像样的伪代码算法和问题列表。

我正在寻找自己的伪代码表示,作为练习。所以即使你找不到伪代码的例子,但你认为用这种方式表示它是一个理想的概念,那也会有所帮助。

我也有一些与这个问题有关的问题:

  • 之前你曾被邀请参加过哪个伪代码?
  • 这些问题是否与一个或两个函数的简短算法有关?
  • 编写伪代码时是否应避免使用特定语言的结构?由于表示意味着语言不可知,不使用每种语言中不存在的Dispose和foreach等术语更安全吗?

由于


编辑:

我发现的一些例子,我会继续编辑,因为我发现了更多:


编写一个函数,该函数使用单个字符串来反转句子中单词的顺序,而不是反转单词:

输入:“猫坐在垫子上,还有另一只猫!”

输出:“猫!另一个带垫子,就坐着的猫”


编写一个函数,该函数接受一个字符串,该字符串将返回该字符串中最常出现的单词,忽略大小写和标点符号。如果多个单词出现次数相同,则返回先发生的单词:

输入:“猫坐在垫子上,还有另一只猫!”

输出:


编写一个函数来查找某个字符串中出现次数最多的字符,忽略大小写。如果存在多个具有相同最高出现次数的字符,则返回字符串中首先出现的字符。

输入:“字符”

输出:c


编写一个反转字符串的函数

输入:“反向”

输出:“esrever”

5 个答案:

答案 0 :(得分:3)

我还没有被问过,但有经典的FizzBu​​zz问题。

  

编写一个程序,打印从1到100的数字。但是对于三个打印的“Fizz”而不是数字的倍数和五个打印“Buzz”的倍数。对于三和五的倍数的数字打印“FizzBu​​zz”。

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

处找到

这是一个简单的筛选问题,即使是非常新的程序员也不会造成任何重大困难。

答案 1 :(得分:1)

我从来没有被要求在面试中使用伪代码(仍然是学生),但我的一位朋友申请谷歌暑期工作被要求编写一个可以处理子集的正则表达式解析器regexps(iirc,仅限字母数字输入并使用*,+和{x,y}表示法)。我正考虑自己明年申请暑期工作,并且害怕尝试在XD现场写这样的东西。

我相信他使用两个相互递归的函数解决了它。不确定如何。

哦,他不仅被要求为此编写伪代码,顺便说一句。他被要求在现场编写可以编译的实际C ++代码。 (在Google文档文档中也是如此)。

答案 2 :(得分:1)

几年前,我在一次实习面试中被要求为此编写一个伪代码解决方案:

编写一个算法,在给定目录路径的情况下,该算法可以计算属于该目录和所有子目录的文件总数。

能够解决这个问题表明了对树遍历的理解。

答案 3 :(得分:0)

我花了很长时间才弄明白,但这是我的Excel VBA解决句子逆转问题的解决方案。

Public Sub SentenceReverse()

Dim InSentence As String 'Input sentence string
Dim OutSentence As String 'Output sentence string
Dim p As Integer 'Word Start
Dim q As Integer 'Word length

p = 1

InSentence = ActiveSheet.Range("A1").Value 'Assign the sentence to a string

For i = 2 To Len(InSentence) + 1 'Loop through all the characters of the input sentence
    If (Mid(InSentence, i, 1) = " " Or i = Len(InSentence) + 1) Then 'This character is a space or this is the the end of the sentence
        q = i - p 'Set the word length to the number of this position minus the position of the start of this word
        OutSentence = Mid(InSentence, p, q) & " " & OutSentence 'Add this word to the start of the output string
        p = i + 1 'Set the start of the next word as the position of this space + 1
    End If
Next i

MsgBox (OutSentence)

End Sub

答案 4 :(得分:0)

我不知道这是否是最优雅的方法,但这是找到最常出现的词的解决方案。这就是我接触它的方式。

  1. 通过循环查找句子来查找单词数,如果找到空格或到达句子末尾,则增加单词计数变量。创建一个这个长度的单词数组。
  2. 使用一个变量作为每个单词的开头,使用另一个变量作为每个单词的长度,再次遍历句子并将前面的字符分配给单词数组的元素。
  3. 对于每个单词数组元素,循环遍历单词数组的每个元素,并进行比较(嵌套循环)。如果匹配,则递增计数数组的位置值,该值显示每个单词出现的次数。
  4. 循环遍历count数组,并将每个字段中的值与到目前为止找到的最大值进行比较。这给出了最大数量,因此也是最常用的单词。输出那个词。

    Public Sub FindCommonWord()

    Dim Insentence As String Dim WordArray()As String Dim CountArray()As Integer Dim p As Integer&#39; Word Start Dim q As Integer&#39;字长 Dim w As Integer&#39;字数 Dim tw As String&#39;这个词 Dim R As Integer&#39;最常用词的位置

    p = 1 w = 1

    Insentence = ActiveSheet.Range(&#34; A1&#34;)。值&#39;将句子分配给字符串

    &#39;遍历所有字符并计算字数 对于h = 2到Len(Insentence)+ 1&#39;循环输入句子的所有字符     如果(Mid(Insentence,h,1)=&#34;&#34;或者h = Len(Insentence)+ 1)那么&#39;这个字符是一个空格或者这是句子的结尾         w = w + 1     万一 接下来h

    w = w - 1

    ReDim WordArray(w) ReDim CountArray(w)

    w = 1 &#39;遍历所有字符并将字分配给数组的元素 对于i = 2到Len(Insentence)+ 1&#39;循环输入句子的所有字符     如果(Mid(Insentence,i,1)=&#34;&#34;或i = Len(Insentence)+ 1)那么&#39;这个字符是一个空格或者这就是句子的结尾         q = i - p&#39;将字长设置为该位置的编号减去该字开头的位置         WordArray(w)= Mid(Insentence,p,q)         p = i + 1&#39;下一个单词的位置         w = w + 1&#39;下一个字     万一 下一个我 w = w - 1&#39;到达最后一个字

    &#39;循环遍历数组以处理每个单词 对于j = 1到w     &#39;循环遍历数组并计算该单词出现的次数     对于k = 1到w         如果UCase(WordArray(k))= UCase(WordArray(j))则CountArray(j)= CountArray(j)+ 1     下一个k 下一个j

    R = 1

    &#39;查找count数组中的最大值 对于n = 1到w     如果CountArray(n)&gt; R然后R = n 下一个 MsgBox(&#34;最常见的词是&#34;&amp; WordArray(R)&amp;&#34;位置&#34;&amp; R&amp;&#34;。&#34;)

    End Sub