平台:win10 x64 +VC6.0

2019/5/22

1.合并三个有序的链表

链表节点定义
struct node
{
    int val;
    struct node* next;
};

struct node* merge_3 (形参由你定义)
{
    //这部分是实现
}

当输入的有序链表是多个的时候,请给出合并算法,并假设链表个数为m,平均长度为n,请分析时间复杂度

思路:参看 https://blog.csdn.net/wwxy1995/article/details/82120194

 #include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20 typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next; }Node; typedef struct Node *LinkList; // 初始化链表
bool InitList(LinkList *L) // 二级指针
{
*L = (LinkList)malloc(sizeof(Node)); //产生头结点,并使L指向此头节点
if (!(*L)) // 存储分配失败
return false;
(*L)->next = NULL;
return true;
}
void CreateFromTail(LinkList L)
{
Node *r, *s;
int temp;
r = L; // r指向链表的当前表尾,其初值指向头节点
while ()
{
scanf("%d", &temp);
if (temp == -)
{
r->next = NULL;
break;
}
s = (Node*)malloc(sizeof(Node)); // 建立新结点s
s->data = temp;
r->next = s;
r = s; }
} // 遍历链表
void PrintList(LinkList L)
{
bool flag = true;
Node *p;
p = L->next;
while (p)
{
if (flag)
{
printf("%d", p->data);
flag = false;
}
else
printf(" %d", p->data);
p = p->next;
}
printf("\n");
} LinkList MergeLinkList(LinkList L1, LinkList L2)
{
LinkList L3;
InitList(&L3); Node *p, *q, *r, *s;
p = L1->next;
q = L2->next;
r = L3;
while (p&&q)
{
if (p->data < q->data)
{
s = (Node*)malloc(sizeof(Node));
s->data = p->data;
s->next = NULL;
r->next = s;
r = s;
p = p->next;
}
else
{
s = (Node*)malloc(sizeof(Node));
s->data = q->data;
s->next = NULL;
r->next = s;
r = s;
q = q->next;
}
} if (p == NULL)
{
r->next = q;
}
if (q == NULL)
{
r->next = p;
}
return L3;
} int main()
{
LinkList L1,L2,L3,L4;
InitList(&L1); // 指针的地址
InitList(&L2); // 指针的地址
InitList(&L3); // 指针的地址
InitList(&L4); // 指针的地址
CreateFromTail(L1);
PrintList(L1);
CreateFromTail(L2);
PrintList(L2);
CreateFromTail(L3);
PrintList(L3);
L4 = MergeLinkList(L1, L2);
PrintList(L4);
L4 = MergeLinkList(L3, L4);
PrintList(L4);
if (L4->next)
PrintList(L4);
else
printf("NULL\n"); }

合并三个有序的链表

时间复杂度:O(max(length(L1),length(L2),length(L1)+length(L2),length(L3)))

2019/5/23

1.“ hello world”转为“ world hello”

思路:参看 C语言字符串指针(指向字符串的指针)详解:http://c.biancheng.net/view/2012.html

 #include <stdio.h>
#include <string.h> void ReverseString(char* s, int from, int to)
{
while(from < to)
{
char t = s[from];
s[from++] = s[to];
s[to--] = t;
}
} void LeftRotateString(char* s, int n, int m)
{
m %=n;
ReverseString(s, , m-);
ReverseString(s, m+, n-);
ReverseString(s, , n-);
} int main(void)
{
int n = , m = , i;
char s[] = "hello world";
printf("转换前的字符串为:%s\n", s);
n = strlen(s);
for(i = ; i < n; i++)
if(s[i] == ' ')
m = i; printf("n=%d,m=%d\n", n,m);
LeftRotateString(s, n, m);
printf("转换后的字符串为:%s\n", s);
return ;
}

字符串反转

时间复杂度O(n),空间复杂度O(1)

2.无序数组,找出全部重复元素

思路:参看《编程之法》1.1字符串的旋转 解法二:三步反转

 #include <stdio.h>

 /* 判断一个数组中是否有重复元素,若有,返回位置及元素 */
void hasDup(int arr[], int n)
{
int i, j;
for(i=; i<n-; i++)
{ for(j=i+; j<n; j++)
if(arr[j] == arr[i])
{
printf("数组中第%d个位置存在重复元素:%d\n",j,arr[i]);
break;
}
continue;
}
} /* 主函数 */
int main()
{
int arr[] = {, , , , , , , , , };
int n = ; hasDup(arr, n); return ;
}

查找无序数组重复元素及位置

3.给定数组arr,返回arr的最长递增子序列

思路:参看左程云 《程序员代码面试指南》  https://blog.csdn.net/hahayikeshu/article/details/85549681

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n=,k[],h[],g=,j,t;
char c;
char m[];
printf("请输入子序列:");
memset(k,,sizeof(k)); //把数组k元素全置为零
while(n--)
{
int i=,l=;
getchar();//滤掉回车
while((c=getchar())!='\n')
{
m[i++]=c;//把输入的元素逐个存入数组
}
for(j=;j<i-;j++)
{
if(m[j]<m[j+])
{
k[l]=k[l]+;
}
else
l++;
}
l++;
if(l==)
{
if(k[]<k[])
{
t=k[];
k[]=k[];
k[]=t;
}
}
if(l>)
{
for(j=;j<l-;j++)
for(i=;i<l-j-;i++)
if(k[i]<k[i+])
{
t=k[i];
k[i]=k[i+];
k[i+]=t;
}
} h[g]=k[];
g++;
}
for(int i=;i<g;i++)
{
printf("\n");
printf("单调递增最长子序列长度为:%d\n",h[i]+);
}
return ;
}

输入数组arr,返回最长递增子序列的长度

参考:最长递增子序列的三种算法  https://blog.csdn.net/love20165104027/article/details/79618367

4.升序数组,找出最接近定值sum的两个元素,并输出

思路:二分查找 参看 https://blog.csdn.net/GenuineMonster/article/details/88838346

问题:long long定义时,如果还用scanf()函数输入,编译器不报错,但是输入的数字完全改变。

针对这个问题,我也找到了相应的解决办法,请看这篇文章:https://blog.csdn.net/GenuineMonster/article/details/88813979

 #include<stdio.h>
#include<stdlib.h>
int a[];//存放升序排列的一列数字
int b[];//存放要找的数字
int m;//输入要查找的数的个数
long finder(int mx, int mn, int mid, int j)//
{//第一步区分查找的这个数是否在开区间内
if (b[j] <= a[mn] || b[j] >= a[mx])//不在
{
//对内部进行细分,到底是比最小的还小,还是比最大的还大
if (b[j] <= a[mn]) //比最小的还小
{
printf("%d\n", a[mn]);
printf("%d\n", a[mn+]);
}
else//比最大的还大
{
printf("%d\n", a[mx-]);
printf("%d\n", a[mx]);
}
}
else//位于最小的数字和最大的数字之间
{
//根据mid来分,比mid大还是比mid小,还是和mid相等
if (a[mn]<b[j] && b[j]<a[mid])//比mid小
{
if (mid - mn != )
{
mx = mid - ;//将mx替换为mid
mid = (mn + mx) / ;//重新计算mid下标
finder(mx, mn, mid, j);
}
else
{
if (a[mid] - b[j]>b[j] - a[mn])//比较距离
printf("%d\n", a[mn]);
else if (a[mid] - b[j]<b[j] - a[mn])
printf("%d\n", a[mid]);
else
printf("%d %d\n", a[mn], a[mid]);
} }
else if (a[mid]<b[j] && b[j]<a[mx])//比mid大
{ if (mx - mid != )
{
mn = mid;//重新计算mn
mid = (mn + mx) / ;//重新计算mid下标
finder(mx, mn, mid, j);
}
else
{
if (b[j] - a[mid]>a[mx] - b[j])
printf("%d\n", a[mx]);
else if (b[j] - a[mid]<a[mx] - b[j])
printf("%d\n", a[mid]);
else
printf("%d %d\n", a[mid], a[mx]);
}
}
else//和mid相等
{
printf("%d\n", b[j]);
if((b[j]-a[mid-]) >= (a[mid+]-b[j]))
printf("%d\n", a[mid+]);
else
printf("%d\n", a[mid-]);
}
}
return ;
}
int main()
{
int j = ;//用作函数循环的
int n;//输入非降序序列的长度
printf("请输入非降序序列的长度:");
scanf("%d", &n);
printf("请输入非降序序列:");
for (int i = ; i<n; i++) //循环输入n个数字
scanf("%d", &a[i]);
//scanf("%d", &m); //输入要查询的数字个数
//for (int i = 0; i<m; i++) //循环输入要查找的数,存在b[i]中
printf("请输入要查找的元素sum:");
scanf("%d", &b[]);
int mx = n - , mn = ;
int mid = (mx + mn) / ;
// for (j = 0; j<m; j++)//循环调用函数,把b[j]中存储的所有要找的数字找完
finder(mx, mn, mid, );
//system("pause");
return ; }

输入一升序数组,返回最接近给定值的两个元素

程序面试题——C实现的更多相关文章

  1. 使用java理解程序逻辑 试题分析

      1.编译Java Applet源程序文件产生的字节码文件的扩展名为() A:.java B..class C:Html D:Exe 正确答案:B 试题分析: 本题考查的是Java程序的开发过程.J ...

  2. 微信小程序面试题

    小程序与原生App哪个好? 答: 小程序除了拥有公众号的低开发成本.低获客成本低以及无需下载等优势,在服务请求延时与用户使用体验是都得到了较大幅度  的提升,使得其能够承载跟复杂的服务功能以及使用户获 ...

  3. 《Java理解程序逻辑试题分析》

    1.以下关于开发java程序的描述错误的是 (). (选择一项) A:开发Java程序的步骤包括:编写源程序.编译.运行 B:编写的Java源程序文件使用 java作为扩展名 C:Java源文件经编译 ...

  4. 微信小程序面试题总结

    A类问题 1 请谈谈微信小程序主要目录和文件的作用? project.config.json 项目配置文件,用得最多的就是配置是否开启https校验: App.js 设置一些全局的基础数据等: App ...

  5. [UOJ#127][BZOJ4195][NOI2015]程序自动分析

    [UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...

  6. 清橙OJ 1082 查找第K小元素 -- 快速排序

    题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...

  7. 2018上IEC计算机高级语言(C)作业 第3次作业_说明

    一.博客作业内容 2018上IEC计算机高级语言(C)作业 第3次作业 二.评分规则说明 1.程序调试题,要描述出调试所遇到问题及修改内容,并表述清楚程序功能.流程图不规范的会减1-2分: 2.知识点 ...

  8. IEC2017级_1-2班2次博客作业成绩说明

    一.博客作业内容 2018上IEC计算机高级语言(C)作业 第2次作业 二.评分规则说明 1.程序调试题,要描述出调试所遇到问题及修改内容,并表述清楚程序功能.流程图不规范的会减1-2分: 2.知识点 ...

  9. [No000096]程序员面试题集【上】

    对几家的面试题凭记忆做个总结,基本全部拿到offer,由于时间比较长,题目只写大体意思,然后给出自己当时的答案(不保证一定正确): abstract类不可以被实例化 蛋糕算法: 平面分割空间:(n-1 ...

随机推荐

  1. Ubuntu 18.04设置1920*1080

    Ubuntu升级后,发现分辨率没有1920*1080,在网上寻找了一个文章解决办法如下. 方案一(临时性,重启会失效): 1.打开终端.输入:cvt 1920 1080 出现有modeline 的提示 ...

  2. Jetson TX2 不同的工作模式

    Jetson TX2 有五种工作模式,下面介绍这几种工作模式下电压.频率以及如何启动. 原理图 几种不同的工作模式 mode mode name Denver Frequency ARM Freque ...

  3. 搭建IIS CA DC Exchange TMG SQL (CA DC篇)

    搭建IIS CA DC Exchange TMG SQL (CA DC篇)   步骤 1: 在“下一步(N) > (按下按钮)”(位于“添加角色向导”中)上用户左键单击   步骤 2: 在“Ac ...

  4. OpenCV3编程入门.记录

    ZC:OpenCV3编程入门_毛星云编著_电子工业出版.pdf 1.在看到 PDF.P134(计算数组加权和:addWeighted()函数)的时候,其中讲到“当输出数组的深度为CV_32S时,这个函 ...

  5. vscode Settings Sync 插件的详细介绍

    参考链接:https://www.jianshu.com/p/dbbdc635f8e1

  6. 数据结构——关于任一二叉树n0=n2+1的证明

    对于任一二叉树,若度为2的结点有n2个,则叶子结点数必为n2+1 证明: 假设该二叉树总共有n个结点(n=n0+n1+n2),则该二叉树总共会有n-1条边,度为2的结点会延伸出两条边, 同理,度为1的 ...

  7. 【转】转载一篇优质的讲解epoll模型的文章

    从事服务端开发,少不了要接触网络编程.Epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,Nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. Epoll ...

  8. Django新手入门必看

    pip install django==2.1.7 (现在Django3.0出来,推荐大家可以使用一下Django3.0) pip list查看

  9. Flask-WTF的使用

    Flask-WTF的使用 一.安装Flask-WTF Flask-WTF 对 WTForms 进行了封装使它能够在 Flask 框架中可以被调用,其中 Flask-WTF 的功能都是继承自 WTFor ...

  10. 【AC自动机】单词

    [题目链接] https://loj.ac/problem/10060 [题意] 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. ...