今天笔试三道编程题记录一下
1.求的斐波那契数列的第n位值
比较简单通过递归实现
using System;
namespace 兔子数列
{
class Program
{
static void Main(string[] args)
{
string str;
int n=0;
while (true)
{
str = Console.ReadLine();
if (int.TryParse(str, out n))
{
Console.WriteLine(get_FibonacciN(n));
}
}
}
public static int get_FibonacciN(int i)
{
if (i < 3)
return 1;
return get_FibonacciN(i - 1) + get_FibonacciN(i - 2);
}
}
}
例如矩阵
4,4
1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16
打印结果是1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
这个题在剑指offer上有,但是之前没看过考试的时候想到别的办法实现
首先考虑矩阵的行和列已知所以需要打印的个数也知道n*m
所以当时就想通过循环n*m次,每次打印一个数,然后就是要考虑每次打印的是哪个数呢
第一个数肯定是[0][0]然后后面的无非四种情况:行+1,行-1,列+1,列-1
using System;
namespace 顺时针打印数组
{
class Program
{
static void Main(string[] args)
{
string str_readline;
string []char_readlines;
int n, m;
str_readline = Console.ReadLine();
char_readlines = str_readline.Split(' ');
n = int.Parse(char_readlines[0]);
m = int.Parse(char_readlines[1]);
int [][] in_array = new int [n][];
for(int i =0;i= 0 && a[row - 1][line] != 0))
{ line++; }
else if (row + 1 < n && a[row + 1][line] != 0)
{ row++; }
else if (line - 1 >= 0 && a[row][line - 1] != 0)
{ line--; }
else if (row - 1 >= 0 && a[row - 1][line] != 0)
{ row--; }
}
}
}
}
等回学校了再研究下剑指offer上的做法。
3.有序数列中找出和为m的两个数.
时间太紧张了,当时就想出来个不太好的解法
依次遍历数列,每找到一个数后再从它开始看后面的数有没有和它加起来等于m的。
using System;
namespace 有序数列找两个数
{
class Program
{
static void Main(string[] args)
{
int[] a = { 1, 2, 3, 4, 5, 6, 7, 11, 13, 18 };
Console.WriteLine("1, 2, 3, 4, 5, 6, 7, 11, 13, 18");
int m = 0;
while (true)
{
m = int.Parse(Console.ReadLine());
for (int i = 0; i < a.Length; i++)
{
if (isInArray(m - a[i], a, i + 1, a.Length - 1))
{
Console.WriteLine(a[i] + " "+ (m - a[i]));
}
}
Console.WriteLine("完成");
}
}
public static bool isInArray(int n, int[] a, int start, int end)
{
if (start >= end)
if (a[end] == n)
return true;
else
return false;
if (a[(end + start) / 2] == n)
return true;
if (a[(end + start) / 2] > n)
return isInArray(n, a, start, (end + start) / 2 - 1);
else
return isInArray(n, a, (end + start) / 2 +1, end);
}
}
}
后来在网上看到一个比较快的方法,数组收尾两个标志向中间逼近,如果和大于m,就让尾部的左移,如果和小于m就让头部的右移。
public static void A(int sum, int[] num, int start, int end)
{
int tmp;
while (start < end)
{
tmp = num[start] + num[end];
if (tmp == sum)
{
Console.WriteLine(num[start] + " " + num[end]);
break;
}
else if (tmp < sum)
{
start ++;
}
else
{
end--;
}
}
}