一道特殊的排序面试题(交换思想活学活用)

2024-05-09 22:18

本文主要是介绍一道特殊的排序面试题(交换思想活学活用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如字符串abcdefg,现在需要按索引顺序1、4、2、0、5、3、6重排序,如对于、4、2、0、5、3、6,排序结果为becafdg


面试中很可能遇到这种非常突兀的问题,这需要基础概念牢固到能够随时运用的地步,本题就是一个锻炼


遇到这种题,步骤:在纸上画心里思考,尽力找出一种较为简单的规律,能够正确完成这样的变化要求!

算法题,一部分是考察数据结构掌握,另一部分就是看逻辑思维,随便过来一个问题,能不能分析出规律,能不能找到靠谱的方法,能不能转化为解决问题的代码!

像二叉树也好,链表数组栈队列也好,字符串也好,图也好,本身数据结构组成和原理就是那些,包括排序查找的常规套路就是那些,但是仅仅“理解了”、“背下来了”、“会了”,但运用很差,甚至代码还处于漏洞百出,那么,不仅并不足以通过高难度面试,而且更不足以完成更有挑战难度的工作

如本题,在纸上画个简单的例子,如:

自己假设abcde按1、2、4、0、3变化,如以第一个字符为“当前”字符,暂存其值a,不断的修改为新值,直到最后某个地方,它需要填充新值a时,结束,可不可以呢?在纸上试试

第1步:bbcde,当前为a,a要跳到1,替换a为原串第1个字符b,

第2步:bccde,当前为b,b要跳到2,替换b为原串第2个字符c

第3步:bcede,当前为c,c要跳到4,替换c为原串第4个字符e

第4步:bcedd,当前为e,e要跳到3,替换c为原串第3个字符d

第5步:bcead,当前为d,d要跳到0,替换c为原串第0个字符a,a就是第一个暂存的字符,直接替换掉结束,结果为:bcead,正确,时间复杂度O(N)


ok,纸上找到了正确的思路,然后就是思路转化为代码,用一个变量代表当前所在索引,再用一个变量代表下一步跳到哪里,用一个字符变量暂存第一个字符,

每跳一次前更新当前所在索引的新值,然后更新当前索引和下一步跳的索引


注意代码中main中大片部分是为了生成一个[0, N-1]范围内的不重复的随机序列(如[0, 7-1]范围内的“、4、2、0、5、3、6”)

代码:

#include <iostream>
#include <string>
#include <random>void sort_by_turn (const std::string &str, int *turn) {std::string res = str;if (!turn || str == "") {return;}size_t idx = 0, next = turn[idx], firstidx = idx;char flag = res[idx];do {res[idx] = res[next];idx = next;next = turn[idx];} while (firstidx != next);res[idx] = flag;std::cout << "result: " << res << std::endl;return;
}int main () {std::string str = "abcdefg";int raw[str.length()];int turn[str.length()];for (int i = 0; i < str.length(); i++) {raw[i] = i;}std::random_device rd;for (int i = 0; i < str.length(); i++) {int num;if (i < str.length() - 1) {int idx = rd() % (str.length() - 1 - i);int num = raw[idx + i];turn[i] = num;int t = raw[i];raw[i] = num;raw[i + idx] = t;} else {turn[i] = raw[i];}}for (int i = 0; i < str.length(); i++) {std::cout << turn[i] << "\t";}std::cout << std::endl;sort_by_turn(str, turn);return 0;
}


这篇关于一道特殊的排序面试题(交换思想活学活用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974654

相关文章

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string