E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
CareerCup
careercup
-树与图 4.3
4.3 给定一个有序整数数组,元素各不相同按升序排列,编写一个算法,创建一棵高度最小的二叉查找树。 解答 想要使构建出来的二叉树高度最小,那么对于任意结点, 它的左子树和右子树的结点数量应该相当。比如,当我们将一个数放在根结点, 那么理想情况是,我们把数组中剩下的数对半分,一半放在根结点的左子树, 另一半放在根结点的右子树。我们可以定义不同的规则来决定这些数怎样对半分, 不过最简单的方法就是取得
·
2015-11-11 06:56
UP
careercup
-树与图 4.1
4.1 实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个结点,其两颗子树的高度差不超过1. C++实现代码: #include<iostream> #include<new> #include<cmath> using namespace std; //Definition for binary tre
·
2015-11-11 06:55
UP
careercup
-栈与队列 3.5
3.5 实现一个MyQueue类,该类用两个栈来实现一个队列。 解答 队列是先进先出的数据结构(FIFO),栈是先进后出的数据结构(FILO), 用两个栈来实现队列的最简单方式是:进入队列则往第一个栈压栈, 出队列如果第二个栈不为空,则直接从第二个栈出队列,否则将第一个栈的数据依次压入第二个栈,然后出栈。每次有数据进入队列,直接进入第一个栈; 每次有数据出队列,在第二个栈不为空时直接从第二个栈出
·
2015-11-11 06:45
UP
careercup
-栈与队列 3.6
3.6 编写程序,按升序对栈进行排序(即最大元素位于栈顶)。最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中(如数组)。该栈支持如下操作:push、pop、peek和isEmpty。 解答 使用一个附加的栈来模拟插入排序。将原栈中的数据依次出栈与附加栈中的栈顶元素比较, 如果附加栈为空,则直接将数据压栈。否则, 如果附加栈的栈顶元素小于从原栈
·
2015-11-11 06:45
UP
careercup
-栈与队列 3.4
3.4 在经典问题汉诺塔中,有3根柱子及N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自底向上从大到小依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时有以下限制: 每次只能移动一个盘子; 盘子只能从柱子顶端滑出移到下一根柱子; 盘子只能叠在比它大的盘子上。 请运用栈,编写程序将所有盘子从第一根柱子移到最后一根柱子上。 使用递归的方法实现如下:
·
2015-11-11 06:44
UP
careercup
-栈与队列 3.3
3.3 栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一
·
2015-11-11 06:43
UP
careercup
-栈与队列 3.1
3.1 描述如何只用一个数组来实现三个栈。 解答 我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1; 出栈就直接将栈顶指针减1;取栈顶值就把栈顶指针指向的单元的值返回; 判断是否为空就直接看栈顶指针是否为-1。 如果要在一个数组里实现3个栈,可以将该数组分为3个部分。如果我们并不知道哪个栈将装 入更多的数据,就直接将这个数组平均分为3个部分,每个部分维护一个栈顶指针,
·
2015-11-11 06:42
UP
careercup
-栈与队列 3.2
3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。 我们假设除了用一个栈s1来保存数据,还用另一个栈s2来保存这些非冗余最小值。那么, 当我们将数据压到要s1时,同时将它和s2的栈顶元素比较,如果不大于s2的栈顶元素, 那么将当前值也压入s2中。这样一来,s2中保存的就是一个阶段性最小值。 即s2中
·
2015-11-11 06:42
UP
careercup
-链表 2.7
2.7 编写一个函数,检查链表是否为回文。 思路:1)可以利用链表中的元素采用头插法创建一个新的链表,然后比较两个链表的元素是否相等。 2)利用快慢指针,将链表后半部分逆转之后,比较前半部分与后半部分是否相等。 3)利用栈将链表中的元素保存,然后弹出与链表中元素比较。 C++实现代码: #include<iostream> #include<
·
2015-11-11 06:41
UP
careercup
-链表 2.6
2.6 给定一个有环链表,实现一个算法返回环路的开头结点。 类似leetcode中 Linked List Cycle II C++实现代码: #include<iostream> #include<new> using namespace std; struct ListNode { int val; ListNode *
·
2015-11-11 06:40
UP
careercup
-链表 2.4
2.4 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。 思路:将小于的结点还是保存在原来的链表中,将大于等于x的结点加入一个新的链表,最后将这两个链表链接起来。 C++实现代码: #include<iostream> #include<new> using namespace std; struc
·
2015-11-11 06:39
UP
careercup
-链表 2.5
2.5 给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。 示例: 输入: (7->1->6)+(5->9->2),即617+295. 输出:2->1->9,即912. 进阶: 假设这些数位是正向存放的 示例: 输入:(6->1->7)+(2-&
·
2015-11-11 06:39
UP
careercup
-链表 2.3
2.3 实现一个算法,删除单向链表中间的某个结点,假设你只能访问该结点。(即你不知道头结点) 这个问题的关键是你只有一个指向要删除结点的指针,如果直接删除它,这条链表就断了。 但你又没办法得到该结点之前结点的指针,是的,它连头结点也不提供。在这种情况下, 你只能另觅他径。重新审视一下这个问题,我们只能获得从c结点开始后的指针, 如果让你删除c结点后的某个结点,那肯定是没问题的。比如删除结点d,那
·
2015-11-11 06:38
UP
careercup
-链表 2.2
2.2 实现一个算法,找到单链表中倒数第k个节点。 这道题的考点在于我们怎么在一个单链表中找到倒数第n个元素? 由于是单链表,所以我们没办法从最后一个元素数起,然后数n个得到答案。 但这种最直观的思路显然是没错的,那我们有没有办法通过别的方式,从最后的元素数起数 n个来得到我们想要的答案呢。 这个次序颠倒的思路可以让我们联想到一种数据结构:栈。 我们如果遍历一遍单链表,将其中的元素压栈,然后
·
2015-11-11 06:37
UP
careercup
-链表 2.1
2.1 编写代码,移除未排序链表中的重复节点。 不使用临时缓存: 如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元素删除, 时间复杂度O(n2 )。 C++实现代码: #include<iostream> #include<new> using namespace
·
2015-11-11 06:37
UP
careercup
-数组和字符串1.8
1.8 假定有一个方法isSubstring,可检查一个单词是否为其他字符串的子串。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次isSubstring。旋转字符串:”waterbottle”是”erbottlewat”的旋转字符串。 解答 题目说我们使用一次isSubstring函数就可以判断s2是否是s1的旋转字符串, 如果从原始字符串s1和
·
2015-11-11 06:36
字符串
careercup
-数组和字符串1.7
1.7 编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零。 类似于leetcode中的 Set Matrix Zeroes C++实现代码: #include<iostream> #include<vector> using namespace std; void setMatricZero(vector<v
·
2015-11-11 06:35
字符串
careercup
-数组和字符串1.6
1.6 给定一幅由N*N矩阵表示的如下,其中每个像素的大小为4个字节,编写一个方法,将图像旋转90度。不占用额外内存空间能否做到? 类似leetcode:Rotate Image 思路: 我们这里以逆时针旋转为例(写代码时比较容易理解,顺时针旋转的实现思想相似),可以先将原矩阵以主对角线为对称轴,交换主对角线两侧的的元素,得到新的矩阵(如果是顺时针旋转
·
2015-11-11 06:34
字符串
careercup
-数组和字符串1.5
1.5 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串”aabcccccaaa“会变成”a2b1c5a3“。若”压缩“后的字符串没有变短,则返回原先的字符串。 类似 leetcode中 解法:Count and say. C++实现代码: #include<iostream> #include<string> using
·
2015-11-11 06:34
字符串
careercup
-数组和字符串1.4
1.4 编写一个方法,将字符串中的空格全部替换为“%20“。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的”真实“长度。 C++实现代码: #include<iostream> #include<string> #include<cctype> using namespace std; string replacespace(str
·
2015-11-11 06:33
字符串
careercup
-数组和字符串1.2
1.2 用C或C++实现void reverse(char *str)函数,即反转一个null结尾的字符串。 C++实现代码: #include<iostream> #include<cstring> using namespace std; /* 反转字符串 */ void reverse(char *str) { if(!str)
·
2015-11-11 06:32
字符串
careercup
-数组和字符串1.3
1.3 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排序后,能否变成另一个字符串。 C++实现代码: #include<iostream> #include<map> #include<string> using namespace std; bool isEqual(string s1,string s2) { map
·
2015-11-11 06:32
字符串
careercup
-数组和字符串1.1
1.1 实现一个算法,确定一个字符串的所有字符是否全部不同。假设不允许使用额外的数据结构,又该如何处理? C++实现: #include<iostream> #include<string> #include<cstring> using namespace std; /* 判断是否有重复字符 */ bool unqString(stri
·
2015-11-11 06:31
字符串
CareerCup
: 17.14 minimize unrecognized characters
Oh, no! You have just completed a lengthy document when you have an unfortu- nate Find/Replace mishap. You have accidentally removed all spaces, punctuation, and capitalization in the docume
·
2015-11-11 01:14
character
careercup
-中等难题 17.2
17.2 设计一个算法,判断玩家是否赢了井字游戏。 解法: 假设这个检查某人是否赢得了井字游戏的函数为HasWon,那么我们第一步要向面试官确认, 这个函数是只调用一次,还是要多次频繁调用。如果是多次调用, 我们可以通过预处理来得到一个非常快速的版本。 方法一:如果HasWon函数需要被频繁调用 对于井字游戏,每个格子可以是空,我的棋子和对方的棋子3种可能,总共有39 = 196
·
2015-11-10 23:45
UP
careercup
-C和C++ 13.10
13.10 用C编写一个my2DALLoc函数,可分配二维数组。将malloc函数的调用次数降到最少,并确保可通过arr[i][j]访问该内存。 解法: 这道题目最简单的方法就是先开一个数组来存储指向每一行的指针, 然后再为每一行动态地分配空间。这是非常常见的动态申请二维数组空间的方法: int** My2DAlloc(int rows, int cols){ int **arr
·
2015-11-10 23:43
C++
careercup
-中等难题
17.1 编写一个函数,不用临时变量,直接交换两函数。 解法: 方法一:这个是经典面试题,也相当直接。我们将用a0表示a的初值,b0表示b的初始值,用diff表示a0-b0的值。 让我们将a>b的情形绘制在数轴上。 首先,将a设为diff,即上面数轴的右边那一段。然后,b加上diff(并将结果保存在b中),就看得到a0.至此,我们得到b=a0和a=diff。最后,只需将b设为a0
·
2015-11-10 23:43
UP
careercup
-C和C++ 13.9
13.9 编写支持对齐分配的malloc和free函数,分配内存时,malloc函数返回的地址必须都能被2的n次方整除。 解法: 一般来说,使用malloc,我们控制不了分配的内存会在堆里哪个位置。我们只会得到一个指向内存块的指针,指针的起始地址不定。 要克服这些限制条件,我们必须申请足够大的内存,要大到可以返回可被指定数值整除的内存地址。 假设需要一个100字节的内存块,我们希望它的
·
2015-11-10 23:42
C++
careercup
-C和C++ 13.7
13.7 写一个函数,其中一个参数是指向Node结构的指针,返回传入数据结构的一份完全拷贝。 Node结构包含两个指针,指向另外两个Node。 C++实现代码: typedef map<Node*, Node*> NodeMap; Node* copy_recursive(Node *cur, NodeMap &nodeMap){ if(cur ==
·
2015-11-10 23:41
C++
careercup
-C和C++ 13.8
13.8 编写一个智能指针类。智能指针是一种数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的引用计数为零,就会释放该对象。 解法: 智能指针跟普通指针一样,但他借助自动化内存管理保证了安全性,避免了诸如悬挂指针、内存泄漏和分配失败等问题。 智能指针必须为给定对象的所有引用维护单一引用计
·
2015-11-10 23:41
C++
careercup
-C和C++ 13.6
13.6 基类的析构函数为何要声明为virtual? 解答: 用对象指针来调用一个函数,有以下两种情况: 如果是虚函数,会调用派生类中的版本。 如果是非虚函数,会调用指针所指类型的实现版本。 析构函数也会遵循以上两种情况,因为析构函数也是函数嘛,不要把它看得太特殊。 当对象出了作用域或是我们删除对象指针,析构函数就会被调用。 当派生类对象出了作用域,派生类的析构函数会先调用
·
2015-11-10 23:40
C++
careercup
-C和C++ 13.5
13.5 谈谈C语言关键字”volatile”的意义(或重要性)? 解答 关键字volatile的作用是指示编译器,即使代码不对变量做任何改动,该变量的值仍可能被外界修改。操作系统、硬件或其他线程都可能修改该变量。该变量的值由可能遭受意料之外的修改,因此,每一次使用时,编译器都会重新从内存中获取这个值。 volatile的意思是”易变的”,因为访问寄存器比访问内存要快得多, 所以编译
·
2015-11-10 23:39
C++
careercup
-C和C++ 13.4
13.4 深拷贝和浅拷贝有什么区别,如何使用? 解答 浅拷贝并不复制数据,只复制指向数据的指针,因此是多个指针指向同一份数据。 深拷贝会复制原始数据,每个指针指向一份独立的数据。通过下面的代码, 可以清楚地看出它们的区别: struct Test{ char *ptr; }; void shallow_copy(Test &src, Test
·
2015-11-10 23:38
C++
careercup
-C和C++ 13.3
13.3 C++中的虚函数是如何工作的? 解答 虚函数依赖虚函数表进行工作。如果一个类中,有函数被关键词virtual进行修饰, 那么一个虚函数表就会被构建起来保存这个类中虚函数的地址。同时, 编译器会为这个类添加一个隐藏指针指向虚函数表。如果在派生类中没有重写虚函数, 那么,派生类中虚表存储的是父类虚函数的地址。每当虚函数被调用时, 虚表会决定具体去调用哪个函数。因此,C++中的动态
·
2015-11-10 23:37
C++
careercup
-C和C++
13.1 用C++写个方法,打印输出文件的最后K行。 解答: 一种方法是打开文件两次,第一次计算文件的行数N,第二次打开文件,跳过N-K行, 然后开始输出。如果文件很大,这种方法的时间开销会非常大。 我们希望可以只打开文件一次,就可以输出文件中的最后k行。 我们可以开一个大小为k的字符串数组,然后将文件中的每一行循环读入。 怎么样循环读入呢?就是将k行字符串保存到字符串数组后, 在读第k+1
·
2015-11-10 23:36
C++
careercup
-C和C++ 13.2
13.2 浅析哈希表和STL map。对比哈希表和STL map。哈希表是怎么实现的?如果输入数据规模不大, 我们可以使用什么数据结构来代替哈希表。 解答 对比哈希表和STL map 在哈希表中,实值的存储位置由其键值对应的哈希函数值决定。因此, 存储在哈希表中的值是无序的。在哈希表中插入元素和查找元素的时间复杂度都是O(1)。 (假设冲突很少)。实现一个哈希表,冲突处理是必须要考虑
·
2015-11-10 23:36
C++
careercup
-排序和查找 11.7
11.7 有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。处于实际和美观的考虑,在上面的人要比下面的人矮一点、轻一点。已知马戏团每个人的高度和重量,请编写代码计算叠罗汉最多能叠几个人。 如果要保持相对顺序不变,那么不能直接排序。 C++实现代码: #include<iostream> #include<vector> using namespac
·
2015-11-10 23:35
UP
careercup
-排序和查找 11.6
11.6 给定M*N矩阵,每一行、每一列都按升序排序,请编写代码找出某元素。 类似leetcode:Search a 2D Matrix 但是与leetcode中这题不同的是下一行的第一个元素不一定大于上一行的最后一个元素。所以使用二分查找有点麻烦。 解法一:通过观察我们可知: 若列的开头大于x,那么x位于该列的左边; 若列的末端小于x,那么x位于该列的右边; 若行的开头小于x
·
2015-11-10 23:34
UP
careercup
-排序和查找 11.5
11.5 有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置。 解法: 如果没有那些空字符串,就可以直接使用二分查找法。比较待查找字符串str和数组的中间元素,然后继续搜索下去。针对数组中散布一些空字符串的情形,我们可以对二分查找法稍作修改,所需的修改就是mid进行比较的地方,如果mid为空字符串,就将mid换到离它最近的非空字符串的位置。 C
·
2015-11-10 23:34
UP
careercup
-排序和查找 11.4
11.4 设想你有一个20GB的文件,每一行一个字符串。请说明将如何对这个文件进行排序。 解法: 当面试官给出20GB大小的限制时,实际上在暗示些什么。就此题而言,这表明他们不希望你将数据全部载入内存。该怎么办呢?做法是只将部分数据载入内存。 我们将整个文件划分为许多块,每个块xMB,其中x是可用的内存大小。每个块各自进行排序,然后存回文件系统。各个块一旦完成排序,我们便将这些块逐一合并在一
·
2015-11-10 23:33
UP
careercup
-排序和查找 11.3
11.3 给定一个排序后的数组,包含n个整数,但这个数组已被旋转很多次,次数不详。请编写代码找出数组中的某个元素。可以假定数组元素原先是按从小到大的顺序排序的。 解法: 可以直接从开始一个一个比较,也可以采用二分查找的方法。 在经典二分查找中,我们会将x与中间元素进行比较,以确定x属于左半部分还是右半部分。此题的复杂之处在于数组被旋转过,可能有一个拐点。 不过在左右两边至少有一边是有序的,
·
2015-11-10 23:32
UP
careercup
-排序和查找 11.2
11.2 编写一个方法,对字符串数组进行排序,将所有变位词1排在相邻的位置。 类似leetcode:Anagrams 解法: 变位词:由变换某个词或短语的字母顺序构成的新的词或短语。例如,“triangle”是“integral”的变位词。 此题有个要求,对数组中的字符串进行分组,将变位词排在一起。注意,除此之外,并没有要求这些词按特定顺序排列。 做法之一就是套用一种标准排序算法,比如归
·
2015-11-10 23:32
UP
careercup
-排序和查找 11.1
11.1 给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。编写一个方法,将B合并入A并排序。 解法: 已知数组A末端有足够的缓冲,不需要再分配额外空间。程序的处理逻辑很简单,就是逐一比较A和B中的元素,并顺序插入数组,直至耗尽A和B中的所有元素。这么做的唯一问题是,如果将元素插入数组A的前端,就必须将原来的元素往后移动,以腾出空间。更好的做法是将元素插入数组A的末端,那里都是空
·
2015-11-10 23:31
UP
careercup
-递归和动态规划 9.11
9.11 给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result值。 解法: 跟其他递归问题一样,此题的关键在于找出问题与子问题之间的关系。 假设函数int f(expression,result)会返回所有值为return的有效表达式的数量。我们想要算出f(1^0|0|1,true)(也
·
2015-11-10 23:30
动态规划
careercup
-递归和动态规划 9.10
9.10 给你一堆n个箱子,箱子宽w,高h,深d。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一个方法,搭出最高的一堆箱子,箱堆的高度为每个箱子高度的总和。 解法: 要解决此题,我们需要找到不同子问题之间的关系。 假设我们又以下这些箱子:b1、b2,...,bn。能够堆出的最高箱堆的高度等于max(底部为b1的最高箱堆,底部为b2的最高箱堆,...,底部为
·
2015-11-10 23:29
动态规划
careercup
-递归和动态规划 9.9
9.9 设计一种算法,打印八皇后在8*8棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。 类似leetcode:N-Queens 回溯法的实现代码: #include<vector> #include<iostream> #include<string> usin
·
2015-11-10 23:28
动态规划
careercup
-递归和动态规划 9.5
9.5 编写一个方法,确定某字符串的所有排列组合。 类似leetcode:Permutations 解法: 跟许多递归问题一样,简单构造法非常管用。假设有个字符串S,以字符序列a1a2a...an表示。 终止条件:n=1 S=a1,只有一种排列组合,即字符串a1 情况:n=2 S=a1a2 有两种排列组合a1a2和a2a1 情况:n 对于一般情况下,我们只需重复这个步骤。即已经求
·
2015-11-10 23:27
动态规划
careercup
-递归和动态规划 9.8
9.8 给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码就是n分有几种表示法。 解法: 使用回溯法进行解决,实际上就是一个类似枚举的过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 C++实现代码: #include<vector> #include<iostream> using
·
2015-11-10 23:27
动态规划
careercup
-递归和动态规划 9.7
9.7 编写函数,实现许多图片编辑软件都支持的“填充颜色”功能。给定一个屏幕(以二维数组表示,元素为颜色值)、一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全部改变。 类似leetcode:Surrounded Regions 解法:首先,想象一下这个方法是怎么回事。假设要对一个像素(比如绿色)调用paintFill(也即点击图片编辑软件的填充颜色),我们希望颜色向四
·
2015-11-10 23:26
动态规划
careercup
-递归和动态规划 9.6
9.6 实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对)。 类似leetcode:Generate Parentheses 解法: 从头开始构造字符串,从而避免出现重复字符串。在这个解法中,逐一加入左括号和右括号,只有字符串仍然有效。每次递归调用,都会有个索引指向字符串的某个字符。我们需要选择左括号或右括号,那么,何时可以用左括号,何时可以用右括号呢? 左括号:只有左括号还没
·
2015-11-10 23:25
动态规划
上一页
1
2
3
4
5
6
7
8
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他