Programming I, Winter 2017-8
Practice Exam -
Solutions
1. Write a
function words
that determines the number of words in a
string. For this problem, words are sequences of non-space characters
separated by one or more spaces. For example, words("
big yellow hat")
= 3.
// iterative solution function words(s: string): integer; var i, n: integer; begin if s = '' then exit(0); if s[1] = ' ' then n := 0 else n := 1; for i := 1 to length(s) - 1 do if (s[i] = ' ') and (s[i + 1] <> ' ') then n := n + 1; words := n; end; // recursive solution function words(s: string): integer; var w: integer; begin if length(s) = 1 then if s[1] = ' ' then exit(0) else exit(1); w := words(s[2 .. length(s)]); if (s[1] <> ' ') and (s[2] = ' ') then exit(w + 1) else exit(w); end;
2. Write a function ones
that takes an integer i
and returns true iff there are any consecutive 1s in the binary
representation of i
. For example, ones(5)
=
false since 5 = 1012, and ones
(6) = true
since 6 = 1102.
// iterative solution function ones(i: integer): boolean; begin while i > 0 do begin if i mod 4 = 3 then exit(true); i := i div 2; end; exit(false); end; // recursive solution function ones(i: integer): boolean; begin if i = 0 then exit(false); exit((i mod 4 = 3) or ones(i div 2)); end;
3. Write a function most
that takes two arguments: (1) an array of integers and (2) a function
f from integers to booleans. most
should return true if
the function f returns true for most (at least half) of the elements
in the array. For example, if a
and odd
are
defined as
var a: array[1..5] of integer = (3, 4, 5, 6, 7) function odd(i: integer): boolean; begin exit(i mod 2 = 1); end;
then most(a, @odd)
= true.
// iterative solution type cond = function(i: integer): boolean; function most(a: array of integer; c: cond): boolean; var count: integer = 0; i: integer; begin for i in a do if c(i) then count := count + 1; exit(count * 2 >= length(a)); end; // recursive solution type cond = function(i: integer): boolean; function count(a: array of integer; c: cond): integer; var i: integer; begin if c(a[0]) then i := 1 else i := 0; if length(a) = 1 then exit(i) else exit(i + count(a[1 .. high(a)], c)); end; function most(a: array of integer; c: cond): boolean; begin exit(count(a, c) * 2 >= length(a)); end;
4. Write a function sub
that takes two
linked lists of integers s
and t
and
returns true iff any subsequence of nodes in s is identical to t. For
example, if s
= 3 → 4 → 2 → 7 → 8 → nil
and t
= 2 → 7 → nil
then sub(s,
t)
= true.
// iterative solution type node = record i: integer; next: ^node; end; pnode = ^node; function startsWith(p, q: pnode): boolean; begin while q <> nil do begin if (p = nil) or (p^.i <> q^.i) then exit(false); p := p^.next; q := q^.next; end; exit(true); end; function sub(p, q: pnode): boolean; begin while true do begin if startsWith(p, q) then exit(true); if p = nil then exit(false); p := p^.next; end; end; // recursive solution type node = record i: integer; next: ^node; end; pnode = ^node; function startsWith(p: pnode; q: pnode): boolean; begin if q = nil then exit(true); exit((p <> nil) and (p^.i = q^.i) and startsWith(p^.next, q^.next)); end; function sub(p: pnode; q: pnode): boolean; begin exit(startsWith(p, q) or ((p <> nil) and sub(p^.next, q))); end;
5. The height of a node in a binary tree is its distance in edges from the root node. The root node has height 0, its children have height 1, and so on. Write a function that determines the sum of the heights of all nodes in a binary tree.
type treeNode = record i: integer; left, right: ^treeNode; end; pTreeNode = ^treeNode; function height1(t: pTreeNode; h: integer): integer; begin if t = nil then exit(0); exit(h + height1(t^.left, h + 1) + height1(t^.right, h + 1)); end; function height(t: pTreeNode): integer; begin exit(height1(t, 0)); end;