平台: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. Masonry问题

    1. Masonry的布局问题: 参考博客: https://github.com/huang303513/UILayoutOfiOS 2. Masonry的自适应行高问题: 参考博客:https:/ ...

  2. Unity和Android交互学习

    这段时间学习Unity和Android互调,从基础开始. 网上的教程有很多,浏览了一圈教程,发现目前有两种方式:一种是直接把 .aar文件导入Unity/Plugins/Android文件夹,另一种是 ...

  3. U3D 自定义shader创建Editor扩展

    “工欲善其事,必先利其器”Shader学习工具篇 最近一直忙于录制关于Shader入门的视频教程,其中一个反复的机械动作就是右键创建所需要的新Shader.悲剧的是每次打开的都是Unity3D默认的S ...

  4. 【DSP开发】CMD文件

    DSP的存储器的地址范围,CMD是主要是根据那个来编的. CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间. 所以不同的芯片就有不同大小的rom和ram.放用户程序的地方 ...

  5. OpenGL.资料积累

    1.又一种Qt + OpenGL 的离屏渲染方法 - liji_digital的博客 - CSDN博客.html(https://blog.csdn.net/liji_digital/article/ ...

  6. js 数组扁平

    // 数组扁平和去重 var arr = [[1,2,2],[3,4,5,5],[6,7,7,9,[11,12,[12,13,[14]]]],10]; function hello (arr) { l ...

  7. UWP 保存音乐或视频缩略图图片到本地

    开发项目时,有时需要将本地媒体文件的缩略图保存到本地,下面是源码. 需要打开Package.appxmanifest 功能 图片库 访问权限. <Page x:Class="SaveB ...

  8. Java网络编程-你是GG还是MM?

    第六阶段 网络编程 每一台计算机通过网络连接起来,达到了数据互动的效果,而网络编程所解决的问题就是如何让程序与程序之间实现数据的通讯与互动 在吗?你是GG还是MM? (一) 网络模型概述 (1) 两大 ...

  9. Kubernetes组件-CronJob(定时任务)

    ⒈简介: Kubernetes的Job资源在创建时会立即运行pod.但是许多批处理任务需要在特定的时间运行,或者在指定的时间间隔内重复运行.在Linux和类UNIX操作系统中,这些任务通常被称为cro ...

  10. c++:论如何成功把自己搞懵【二叉树特辑①】(不定期更新)

    并不正经的前言 以前我这个小白看OI的书,老觉得有些东西很高端(看不懂的自然就很高端[滑稽]):什么栈啊,位运算啊,二叉树啊.有些东西我学了之后也很迷糊(真的不是因为傻?),做题的时候总是可以把自己搞 ...