1将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并使奇数之间顺序反转,偶数之间顺序反转。
示例:
交换前链表的顺序 交换后链表的顺序
4→5→7→1→6 ==> 1→7→5→6→4
1 ==> 1 (链表仅含一个元素)
2→1 ==> 1→2
==> (链表为空)
C/C++:
链表节点定义为:
struct node {
struct node *next;
int value;
};
struct node *swap(struct node *list);
Java:
链表节点定义为:
class Node {
public Node next;
public int value
}
Node swap(Node list)
注意点和要求如下:
1. swap函数要求对节点的指针/引用进行操作(不得创建任何新的链表节点)
2. 不得使用任何库函数/API,如需使用类似功能, 请自行实现
3. 不得将链表转化为其他类型数据结构再进行交换,如数组等
2给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, ... )使得他们的和等于 n。你需要让平方数的个数最少。
给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。
给出 n = 13, 返回 2 因为 13 = 4 + 9。
第一题:
class Node
{
public Node next;
publicintvalue;
// public Node(int value,Node next)
// {
// this.next=next;
// this.value = value;
// }
}
publicclass Factory
{
publicstaticvoid main(String[] args)
{
// Node a1 = new Node(4,null);
// Node a2 = new Node(5,null);
// Node a3 = new Node(7,null);
// Node a4 = new Node(1,null);
// Node a5 = new Node(6,null);
// a1.next=a2;
// a2.next=a3;
// a3.next=a4;
// a4.next=a5;
// a1 = swap(a1);
// print(a1);
}
publicstatic Node swap(Node list)
{
if(list == null)
return list;
if(list.next==null)
return list;
Node first = list;
Node ou = null,head2 = null;
Node ji = null,head1 = null;
Node next=null;
int i=0,j=0;
while(first!=null)
{
if(first.value%2!=0)
{
i++;
if(i==1)
{
ji=first;
head1 =ji;
}
else
{
ji.next=first;
ji=ji.next;
}
}
else
{
j++;
if(j==1)
{
ou=first;
head2 =ou;
}
else
{
ou.next=first;
ou=ou.next;
}
}
first = first.next;
}
ji.next=null;
ou.next=null;
next=head1=swap2(head1);
head2=swap2(head2);
while(head1.next!=null)
head1=head1.next;
head1.next=head2;
return next;
}
publicstatic Node swap2(Node list)
{
Node head =list;
Node p = list.next;
Node next =p;
head.next=null;
while(p!=null)
{
next = p.next;
p.next=head;
head =p;
p=next;
}
return head;
}
publicstaticvoid print(Node list)
{
while(list!=null)
{
System.out.print(list.value+" ");
list=list.next;
}
}
}
第二题:
//import java.util.Scanner;
publicclass Factory2
{
publicstaticvoid main(String[] args)
{
// Scanner sc = new Scanner(System.in);
// while(sc.hasNext())
// {
// System.out.println(compute(sc.nextInt()));
// }
}
publicstaticint compute(int N)
{
int[] a = newint[N+1];
a[0] = 1;a[1] = 1;
if(N==1)
return 1;
if(sqrt(N))
return 1;
for(int i=2;i<=N;++i)
{
if(sqrt(i))
{
a[i]=1;
continue;
}
a[i] = a[i-1]+1;
for(int j=i-1;j>=i/2;--j)
{
if(a[i]>=(a[j]+a[i-j]))
a[i]=(a[j]+a[i-j]);
}
}
return a[N];
}
publicstaticboolean sqrt(int n)
{
for(int i=1;i<=Math.sqrt((double)n);i++)
{
if(i*i == n)
returntrue;
}
returnfalse;
}
// public static void print(int[] a)
// {
// for(int i=0;i
// {
// System.out.print(a[i]+"");
// }
// System.out.println();
// }
}