型:
void FoxmatString(char str [], int len) {
}
#include
〈string. h>
void FormatString (char str [], int len) [
if (str == NULL | | len <= 0) {
return;
int i = 0; int j = 0;
if (str[i] ==‘‘){
while (str [i] == ' ') {
++i;
while (str[i] != '
){
if (str [i] ==''&& str [i - 1] == ' ' | | str [i + 1] == ' \\0‘){
++i; continue; }
str[j++] = str [i++]; }
str[j] = '\\0‘; }
int main() {
char a[] = i am a little boy. ”; int len = strlen(a); printf (°%d\\n°, len); Format String (a, len); printf(°%d\\n°, strlen(a)); printf(°%s\\n°, a); return 0; }
16.给定一颗二叉树,以及其中的两个node (地址均非空), 要求
给岀这两个node的一个公共父节点,使得这个父节点 与两个节
点的路径之和最小。描述你程序的最坏时间复杂 度,并实现具体函数,函数输入输岀请参考如下的函数原型; 型:
stmcy TreeMode {
TreeHode* left; /月^向左子树 TreeHode* right; /滞子树 TreeHode* f ather; /潴向父亲节点
I;
TreeMode* LowestCommonAncestor (TreeHode* f irst, TreeMode* second) {
}
int no deHeight(TreeNode* node)
int height = 0; while(no de != NULL) height++;
node = no de~'father;
}
I
TreeNode* LowestCommonAncestor(TreeHode* first, TreeNode* second)
[
int diff = no deHeight(first) - no deHeight(second); if (diff > 0)
[
while(diff > 0)
[
first = first~>father; diff—;
} }
else
[
while(diff < 0)
[
second = sec ond~ ather. diff++;
} }
while(first != second)
[
first = first->father;
second = sec ondather; }
return first; }
-
17.计算第K个能表示(2Z * 3勺* 5M)的正整数(i,j,k为整 数)?其
前7个满足此条件的数分别是1,234,5,6,8.
public class Main {
public static void main( String [. args) {
int [] a = new int [1501]; a[l] = 1;
TreeMap Deque new AxrayDeque^Integer^ (); new AxrayDeque^Integer^ (); new AxrayDeque^Integer^ (); map. put(2, 2); map. put(3, 3); map. put(5, 5); for (int i = 2; i < 1501; i—) { if (map. isEmpty ()) break; Map. Ent ry< Int eg er. Integer〉e = map. pollFirstEntry (); int key = e. getKey (); int val = e. getValue (); if (val == 5) { Q5. add (key * 5); map. put(Q5. pollFirs~ (), 5); } else if (val == 3) { Q5. add (key * 5); Q3. add (key * 3); map. put(Q3. pollFirsi (), 3); } else { Q5. add (key * 5); Q3. add (key * 3); Q2. add (key * 2); map. put(Q2. pollFirsi(), 2); a[i] = key; } Scanner sc = new Scanner (System, in); while (sc.hasNextO) { System, out. prmtln(a[sc.nextlnt ()]); 18. B-树和B+树的区别是什么? B-树是一种多路搜索树(并不是二叉的。),一颗m阶的B-树,或为空树,或者定义 任意非 叶子结点最多只有M个儿子。 且M>2;根结点的儿子数为[2, M]。 除根结点以外的非叶子结点的儿子数为[H/2]。 每个结点存放至少M/2-1 (职上整)和至多M-1个关键字;(至少2个关键字)非叶子 结点的 关键字个数=指向儿子的指针个数T ; B+树,B+树是B-树的变体,也是一种多路搜索树:其定义基本与B-树同。 B-树是一种 多路搜索树(并不是二叉的。),一颗m阶的B-树,或为空树, 或 者定义任意 非叶子结点最 多只 有M个儿子。 且M>2;根结点的儿子数为[2, M]。 除根结点以外的非叶子结点的儿子数对[M/2]。 每个结点存放至 少M/^l (职上整)和至多M-1个 关键 字;(至少2个关 键字)非叶子结点的关键字个数=指向儿子指针个数T; B+树,B+树是B-树的变体,也是一种多路搜索树:其定义基本与B-树同。 19.分布式服务接口的幕等性如何设计(比如不能重复扣 款)? 所谓幕等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确的, 比如不能多扣款,不能多插入一条数据,不能将统计值多加了 1。这就是幕等性,不给 大家来学术性词语了。 其实保证幕等性主要是三点: (1) 对于每个请求必须有一个唯一的标识,举个例子:订单支付请求,肯定得包含订 单id,— 个订单id最多支付一次,对吧 (2) 每次处理完请求之后,必须有一个记录标识这个请求处理过了,比如说常见的方 案是 在吋四1中记录个状态嗜的,比如支付之前记录一条这个订单的支付流水,而且支 付流水采 (3) 每次接收请求需要进行判断之前是否处理过的逻辑处理,比如说,如果有一个订 单已 经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入 支付流水, orderld已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用 再扣款了。 (4) 上面只是给大家举个例子,实际运作过程中,你要结合自己的业务来,比如说用 redis 用皿derid作为唯一键。只有成功插入这个支付流水,才可以执行实际的支付扣 要求是支付一个订单,必须插入一条支何流水,order.id建一个唯一键,unique key 所以你在支付一个订单之前,先插入一条支付流水,ordez_id就已经进去了 你就可以写一个标识到 re dis里面去,set order_id payed,下一次重复请求过来了, 先查:redis的order_id对应的value,妇果是payed就说明已经支付过了,你就别重 复支付了 然后呢,你再重复支付这个订单的时候,你写尝试插入一条支付流水,数据库给你报错 了,说unique key冲突了,整个事务回滚就可以了 来保存一个是否处理过的标识也可以,服务的不同实例可以一起操作redis。