
算法
土戈
软件开发
展开
-
图的拓扑排序(C++实现)
#ifndef TOPO_H#define TOPO_H#include<vector>#include<unordered_map>#include<unordered_set>#include<queue>#include<algorithm>#include<limits.h>#include"../...原创 2019-03-08 10:37:03 · 3039 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
// 面试题21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分。 // ====================方法一==================== static void odd_even_1(std::vector<int&...原创 2019-03-09 08:13:02 · 84 阅读 · 0 评论 -
顺时针打印矩阵
// 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 static void print_matrix(int** numbers, int columns, int rows, std::vector<int>& out_arr) { if(numbers == nullptr ...原创 2019-03-09 08:13:10 · 120 阅读 · 0 评论 -
栈的压入、弹出序列
// 面试题31:栈的压入、弹出序列 // 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是 // 否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、 // 5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但 // 4、3、5、1、2就不可能是该压栈序列的弹出序列。 static bo...原创 2019-03-09 08:13:18 · 124 阅读 · 0 评论 -
字符串的排列
// 面试题38:字符串的排列 // 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc, // 则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 static void permutation(char* str) { if(str == nullptr) {...原创 2019-03-09 08:13:25 · 75 阅读 · 0 评论 -
数组中出现次数超过一半的数字
// 面试题39:数组中出现次数超过一半的数字 // 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例 // 如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中 // 出现了5次,超过数组长度的一半,因此输出2。 static bool _is_more_than_half(const std:...原创 2019-03-09 08:13:34 · 82 阅读 · 0 评论 -
最小的k个数
// 面试题40:最小的k个数 // 题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8 // 这8个数字,则最小的4个数字是1、2、3、4。 // ====================方法1==================== static bool get_least_knum(std::vector<int>...原创 2019-03-09 08:14:11 · 70 阅读 · 0 评论 -
连续子数组的最大和
// 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整 // 数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 static bool max_sum(const std::vector<int>& arr, int& out_sum) { ...原创 2019-03-09 08:13:40 · 101 阅读 · 0 评论 -
数字序列中某一位的数字
// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这 // 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一 // 个函数求任意位对应的数字。 static int digit_at(uint32_t index) { if...原创 2019-03-09 08:13:51 · 165 阅读 · 0 评论 -
二进制中1的个数
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如 // 把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。 uint32_t num_of_1(int n) { uint32_t count = 0; while (n) { ...原创 2019-03-09 08:12:55 · 77 阅读 · 0 评论 -
剪绳子
// 面试题14:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。 // 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]*k[1]*…*k[m]可能的最大乘 // 积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此 // 时得到最大的乘积18。 // ====...原创 2019-03-09 08:12:46 · 89 阅读 · 0 评论 -
图的最短路径(4种算法)
#ifndef SHORTEST_PATH_H#define SHORTEST_PATH_H#include<queue>#include<limits.h>#include<memory>#include"../data_struct/data_struct.h"/// (1)当权值为非负时,用Dijkstra。/// (2)当权值有负值...原创 2019-03-08 10:40:01 · 2032 阅读 · 0 评论 -
最小生成树(两种算法)
#ifndef MIN_TREE_H#define MIN_TREE_H#include<queue>#include<memory>#include<limits.h>#include<iostream>#include"../data_struct/data_struct.h"#include"../tool/tool_dis...原创 2019-03-08 10:41:18 · 1047 阅读 · 1 评论 -
找出数组中重复的数字
// 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的。 // 请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, // 那么对应的输出是重复的数字2或者3。 static bool get_duplicate_num1(std::...原创 2019-03-08 10:42:28 · 307 阅读 · 0 评论 -
二维数组中的查找
// 面试题4:二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个 // 整数,判断数组中是否含有该整数。 bool find(const int* matrix, int rows, int columns, int number) ...原创 2019-03-08 10:43:29 · 108 阅读 · 0 评论 -
替换空格
// 面试题5:替换空格 // 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”, // 则输出“We%20are%20happy.”。 /*length 为字符数组str的总容量,大于或等于字符串str的实际长度*/ static void replace_blank(std::string& str)...原创 2019-03-08 10:44:19 · 119 阅读 · 0 评论 -
斐波那契数列 的两种解法
//64位机: sizeof(long long)=8; sizeof(long)=8; // 面试题10:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。 // ====================方法1:递归==================== long long fib_r(uint32_t n) ...原创 2019-03-08 10:45:05 · 355 阅读 · 0 评论 -
旋转数组的最小数字
// 面试题11:旋转数组的最小数字 // 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 // 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 // {3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 static bool min_rotate(const std::ve...原创 2019-03-08 10:45:39 · 85 阅读 · 0 评论 -
矩阵中的路径
// 面试题12:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、 // 上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入 // 该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字 // ...原创 2019-03-08 10:46:15 · 205 阅读 · 0 评论 -
机器人的运动范围
// 面试题13:机器人的运动范围 // 题目:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和 // 大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。 // 但它不能进入方格(35, 38),因为3+5+3+8=1...原创 2019-03-08 10:47:31 · 97 阅读 · 0 评论 -
把数组排成最小的数
// 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数 // 字能排成的最小数字321323。 static void print_min_num(const std::vector<uint32_t>&...原创 2019-03-10 09:23:41 · 78 阅读 · 0 评论 -
数组中的逆序对
// 面试题51:数组中的逆序对 // 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组 // 成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 static uint32_t inverse_pairs(std::vector<int>& arr) { if(arr.size() < 1)...原创 2019-03-10 09:24:33 · 201 阅读 · 0 评论 -
礼物的最大价值
// 面试题47:礼物的最大价值 // 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值 // (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或 // 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计 // 算你最多能拿到多少价值的礼物? static int get_max_gift(cons...原创 2019-03-10 09:23:49 · 121 阅读 · 0 评论 -
求1+2+…+n
// 面试题64:求1+2+…+n // 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case // 等关键字及条件判断语句(A?B:C)。 static int sum(int n) { int num = 0; (n > 0) && (num = n + ...原创 2019-03-11 08:44:48 · 305 阅读 · 0 评论 -
不用加减乘除做加法
// 面试题65:不用加减乘除做加法 // 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ static int add(int num1, int num2) { int sum, carry; do { sum = num1 ^ num2; carr...原创 2019-03-11 08:44:55 · 99 阅读 · 0 评论 -
构建乘积数组
// 面试题66:构建乘积数组 // 题目:给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其 // 中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。 static bool product_arr(const std::vector<double>&...原创 2019-03-11 08:45:06 · 100 阅读 · 0 评论 -
数据流中的中位数
#ifndef TG_DATA_STREAM_MEDIAN_H#define TG_DATA_STREAM_MEDIAN_H#include <algorithm>#include <vector>#include <functional>#include<exception>// 面试题41:数据流中的中位数// 题目:如何得到...原创 2019-03-11 08:45:15 · 98 阅读 · 0 评论 -
字符流中第一个只出现一次的字符
#ifndef TG_FIRST_APPEAR_ONCE_H#define TG_FIRST_APPEAR_ONCE_H#include <cstdio>#include <vector>#include <limits>#include<array>// 面试题50(二):字符流中第一个只出现一次的字符// 题目:请实现一个函数...原创 2019-03-12 09:21:22 · 142 阅读 · 0 评论 -
队列的最大值
#ifndef TG_MAX_IN_WINDOW_H#define TG_MAX_IN_WINDOW_H#include<deque>#include<stdint.h>// 面试题59(二):队列的最大值// 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,// 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗...原创 2019-03-12 09:21:32 · 301 阅读 · 0 评论 -
自定义字符串
#ifndef TG_STRING_H#define TG_STRING_H#include <iostream>#include<string.h>class tg_string{public: tg_string(const char *str = nullptr);// 普通构造函数 tg_string(const tg_string ...原创 2019-03-12 09:21:48 · 955 阅读 · 0 评论 -
包含min函数的栈
#ifndef TG_STACK_MIN_H#define TG_STACK_MIN_H#include<stack>#include<stdlib.h>// 面试题30:包含min函数的栈// 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min// 函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。templa...原创 2019-03-12 09:21:58 · 102 阅读 · 0 评论 -
股票的最大利润
// 面试题63:股票的最大利润 // 题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股 // 票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5, // 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能 // 收获最大的利润11。 static bool get_...原创 2019-03-11 08:44:42 · 419 阅读 · 0 评论 -
扑克牌的顺子
// 面试题61:扑克牌的顺子 // 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 // 2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。 static bool is_continuous(std::vector<int>& arr) { if(arr.siz...原创 2019-03-11 08:44:27 · 342 阅读 · 0 评论 -
n个骰子的点数
// 面试题60:n个骰子的点数 // 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s // 的所有可能的值出现的概率。 static std::vector<double> probability(int n, const int max_point) { if (n < 1 || max_point...原创 2019-03-11 08:44:20 · 141 阅读 · 0 评论 -
最长不含重复字符的子字符串
// 面试题48:最长不含重复字符的子字符串 // 题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子 // 字符串的长度。假设字符串中只包含从'a'到'z'的字符。 // 方法一:蛮力法 static uint32_t max_len_no_rep(const std::string& str) { uint3...原创 2019-03-10 09:23:55 · 145 阅读 · 0 评论 -
丑数
// 面试题49:丑数 // 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到 // 大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。 // 习惯上我们把1当做第一个丑数。 // ====================算法1的代码==================== static uin...原创 2019-03-10 09:24:12 · 117 阅读 · 0 评论 -
字符串中第一个只出现一次的字符
// 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。 static char first_no_rep_char(const std::string& str) { if(str.empty()) { retur...原创 2019-03-10 09:24:25 · 304 阅读 · 0 评论 -
数字在排序数组中出现的次数
// 面试题53(一):数字在排序数组中出现的次数 // 题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, // 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。 static int get_count_of_num(const std::vector<int>& arr, int k) ...原创 2019-03-10 09:24:41 · 105 阅读 · 0 评论 -
数组中只出现一次的两个数字
// 面试题56(一):数组中只出现一次的两个数字 // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序 // 找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 static bool get_nums_appear_once(const std::vector<int>& arr, int&...原创 2019-03-10 09:25:29 · 162 阅读 · 0 评论 -
和为s的两个数字
// 面试题57(一):和为s的两个数字 // 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们 // 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 static bool get_sum_nums(std::vector<int>& arr, int sum, int& num1, int& num...原创 2019-03-10 09:24:54 · 110 阅读 · 0 评论