例如字符串"abaccddccefe"中的"ccddcc"
我想到了一个解决方案,但它在O(n ^ 2)时间运行
Algo 1:
步骤:它是一种强力方法
问题:1.这个算法在O(n ^ 2)时间运行.
算法2:
你们能想到一个在更好的时间里运行的算法吗?如果可能的话O(n)时间
您将获得一个整数介于1和1,000,000之间的数组.一个整数在数组中两次.你怎么决定哪一个?你能想到一种方法来使用额外的内存来做到这一点.
ALGO:
你们能想到更好的解决方案吗?
我能想到的是:
ALGO:
你能想到比这更好的解决方案吗?使用O(n)运行时并且不使用额外的空间
这是一个面试问题
我想到了一个解决方案.它使用队列.
public Void BFS()
{
Queue q = new Queue();
q.Enqueue(root);
Console.WriteLine(root.Value);
while (q.count > 0)
{
Node n = q.DeQueue();
if (n.left !=null)
{
Console.Writeln(n.left);
q.EnQueue(n.left);
}
if (n.right !=null)
{
Console.Writeln(n.right);
q.EnQueue(n.right);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法比这更好的解决方案,它不使用Queue?
我能想到的一种方法是反转列表然后阅读它.但这涉及改变不好的清单.
或者我可以复制列表然后将其反转,但这会使用额外的O(n)内存.有没有更好的方法不使用额外的内存,不修改列表并在O(n)时间运行
反向链表代码在c#中是这样的
Void Reverse (Node head)
{
Node prev= null;
Node current = head;
Node nextNode = null;
while (current!=null)
{
nextNode = current.Next;
current.Next = prev;
prev=current;
current = nextNode;
}
head = prev;
}
Run Code Online (Sandbox Code Playgroud)
递归解决方案是
void ReadBackWard (Node n)
{
if (n==null)
return;
else
ReadBackward(n.Next);
Console.WriteLine(n.Data);
}
Run Code Online (Sandbox Code Playgroud) 给出一个链接的数字列表.交换每2个相邻的链接.例如,如果给您的链接列表是:
a->b->c->d->e->f
Run Code Online (Sandbox Code Playgroud)
预期产量:
b->a->d->c->f->e
Run Code Online (Sandbox Code Playgroud)
必须交换每2个备用链接.
我在这里写了一个解决方案.你能给我一些其他解决方案吗?你能评论一下我的解决方案并帮助我更好地写出来吗?
void SwapAdjacentNodes (Node head)
{
if (head == null) return;
if (head.next == null) return;
Node curr = head;
Node next = curr.Next;
Node temp = next.Next;
while (true)
{
temp = next.Next;
next.Next = curr;
curr.Next = temp;
if (curr.Next != null)
curr = curr.Next;
else
break;
if (curr.Next.Next!=null)
next = curr.Next.Next;
else
break;
}
}
Run Code Online (Sandbox Code Playgroud) 我在考虑解决这个问题.
我的输入:
1.有一个指向最后一个节点的尾指针.
2.一旦知道了最后一个指针,就可以轻松地在它旁边添加一个新节点.
Void Insert(Node N)
{
if (head == null) // linked list is empty
{
head = N; tail = N; tail.Next = head;
}
else
{
Node temp = tail.Next; // since this is circular tail will point to head
Tail.Next = N;
N.Next = temp; // correct
tail = N;
}
}
Run Code Online (Sandbox Code Playgroud)
没有使用尾指针,任何人都能想到更好的解决方案吗?还如问题所述没有遍历?这是一个面试问题,只需要一些输入来找到最佳解决方案.
我写了一个创建链表副本的方法.
你们能想到比这更好的方法吗?
public static Node Duplicate(Node n)
{
Stack<Node> s = new Stack<Node>();
while (n != null)
{
Node n2 = new Node();
n2.Data = n.Data;
s.Push(n2);
n = n.Next;
}
Node temp = null;
while (s.Count > 0)
{
Node n3 = s.Pop();
n3.Next = temp;
temp = n3;
}
return temp;
}
Run Code Online (Sandbox Code Playgroud) 实现一个算法,该算法将两个字符串作为输入,并返回两者的交集,每个字母最多表示一次.
Algo :(考虑使用的语言将是c#)
这是一个O(n)解决方案但是使用了额外的空间,2个char数组和一个哈希表
你能想到比这更好的解决方案吗?
这是递归代码.
你们能否就如何使用迭代方法实现这一点给出意见?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PermAndComb
{
class Program
{
static void Main(string[] args)
{
string s = "abcd";
Permutation(s);
Console.ReadKey();
}
public static void Permutation(string s)
{
int len = s.Length;
char [] inStr = s.ToCharArray();
StringBuilder outStr = new StringBuilder();
bool[] used = new bool[len];
doPermute(inStr, outStr,used, len, 0);
}
public static void doPermute(char[] instr, StringBuilder outStr,bool [] used, int len, int level)
{
if (level == len)
{
Console.WriteLine(outStr.ToString());
return;
} …Run Code Online (Sandbox Code Playgroud)