您的位置:首页 > 职场人生

面试笔试杂项积累-leetcode 66-70

2016-02-01 23:11 597 查看

66.66-Plus One-Difficulty:Easy

Given a non-negative number represented as an array of digits, plus one to the number.

The digits are stored such that the most significant digit is at the head of the list.

思路

模拟加一进位,循环加一,而且只是加一,很简单

public class Solution {
public int[] PlusOne(int[] digits) {
for (int i = digits.Length - 1; i > -1; i--)
{
if (digits[i] + 1 >= 10)
{
digits[i] = 0;
}
else
{
++digits[i];
return digits;
}
}
int[] fin = new int[digits.Length + 1];
Array.Copy(digits, 0, fin, 1, digits.Length);
fin[0] = 1;
return fin;
}
}

67.67-Add Binary-Difficulty:Easy

Given two binary strings, return their sum (also a binary string).

For example,

a =
"11"


b =
"1"


Return
"100"
.

思路

模拟二进制相加,

由于多次操作string,首次使用了StringBuilder,哈哈

分几种情况,二者是0,二者是1,一0一1,分别判断相加。

public class Solution {
public string AddBinary(string a, string b) {
string max = "";
string min = "";
StringBuilder final = new StringBuilder();
if (a.Length >= b.Length)
{
max = a;
min = b;
}
else
{
max = b;
min = a;
}
int temp = 0;
for (int i = 0; i < max.Length; i++)
{
if (i < min.Length)
{
if (min[min.Length - 1 - i] != max[max.Length - 1 - i])
{
if (temp > 0)
{
final.Append("0");
}
else
{
final.Append("1");
}
}
else
{
if (min[min.Length - 1 - i] == 48)
{
if (temp > 0)
{
final.Append("1");
--temp;
}
else
{
final.Append("0");
}
}
else
{
if (temp > 0)
{
final.Append("1");
}
else
{
final.Append("0");
++temp;
}
}
}
}
else
{
if (temp > 0)
{
if (max[max.Length - 1 - i] == 48)//0
{
final.Append("1");
--temp;
}
else//1
{
final.Append("0");
}
}
else
{
min = new string(ReverseStr(final.ToString()));
max = max.Substring(0, max.Length - i );///
return max + min;/////
}
}
}
if (temp > 0)
{
final.Append("1");
}
max = new string(ReverseStr(final.ToString()));
return max;
}
public static char[] ReverseStr(string message)
{
char[] arr = message.ToCharArray();
Array.Reverse(arr);
return arr;
}
}

68.68-Text Justification-Difficulty:Hard

Given an array of words and a length L, format the text such that each line has exactly
L characters and is fully (left and right) justified.

You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces
' '
when necessary so that each line has exactly L characters.

Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.

For the last line of text, it should be left justified and no extra space is inserted between words.

For example,
words:
["This", "is", "an", "example", "of", "text", "justification."]

L:
16
.

Return the formatted lines as:

[
"This    is    an",
"example  of text",
"justification.  "
]

Note: Each word is guaranteed not to exceed
L in length.

思路

很简单,找到可以插入的单词个数之后根据长度可以求出所有空格长度,再平均分配给除最后一个单词所有单词的后面。

注意最后一行需要左对齐

public class Solution {
public IList<string> FullJustify(string[] words, int maxWidth) {
IList<string> fin = new List<string>();
int times = 1;
int i_temp = 0;
string str_temp = "";
int length_temp = 0;
int fillsapce = 0;
int space_times = 0;
bool isLast = false;
for (int i = 0; i < words.Length; i++)
{
times = 1;
i_temp = i;
str_temp = "";
length_temp = words[i].Length;
if (i_temp + 1 < words.Length)
while (length_temp + times + words[i_temp + 1].Length <= maxWidth)
{
length_temp += words[i_temp + 1].Length;
++times;
++i_temp;
if (i_temp + 2 > words.Length)
{ isLast = true; break; }
}
fillsapce = maxWidth - length_temp;
if (isLast)//最后一行左对齐
{
for (int j = 0; j < times; j++)
{
words[i + j] += " ";
--fillsapce;
}
for (int j = 0; j < fillsapce; j++)
{
words[i + times - 1] += " ";
}
for (int j = 0; j < times; j++)
{
str_temp += words[j + i];
}
}
else//非最后一行以及最后一行是一个单词的情况
{
space_times = times > 1 ? times - 1 : times;
for (int j = 0; j < fillsapce; j++)
{
words[i + j % space_times] += " ";
}
for (int j = 0; j < times; j++)
{
str_temp += words[j + i];
}
}
i += (times - 1);
fin.Add(str_temp);
}

return fin;
}
}

69.69-Sqrt(x)-Difficulty:Medium

Implement
int sqrt(int x)
.

Compute and return the square root of x.

思路

模拟sqrt函数

注意超时问题

试了一下c# Math.Pow函数= =。。。可以通过

使用binary search可以解决超时问题

public class Solution {
public int MySqrt(int x) {
if (x < 0)
return -1;

if (x == 0)
return 0;

int low = 1; // the low should be set to 1. it's different from the search in array.
int high = x / 2 + 1; // the high should be set to x / 2 + 1
int mid;

while (low <= high)
{

mid = (high + low) / 2;

if ((x / mid >= mid) && ((mid + 1) > x / (mid + 1)))
{ //to avoid overflow
return mid;
}
else if (x / mid < mid)
{
high = mid - 1;
}
else
{
low = mid + 1;
}

}

return -1;
}
}

70.70-Climbing Stairs-Difficulty:Easy

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

思路

有多少不同的方式能爬到数组顶端,一次能爬1/2步。

把上面的左上角到右下角换成线性的了= =。。依旧动态规划问题

public class Solution {
public int ClimbStairs(int n) {
if (n <= 1)
return 1;
if (n == 2)
return 2;
int[] temp = new int
;

temp[0] = 1;
temp[1] = 2;
for (int i = 2; i < n; i++)
{
temp[i] = temp[i - 1]+temp[i-2];
}
return temp[n - 1];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: