38(字符串的所有排列)、39(数组中出现次数超过一半的数字)、40(最小的K个数)

题目38分析:(字符串的所有排列)

将字符串分为两部分,第一部分是第一个字符,第二部分是其余字符,递归其余字符

#include <iostream>

using namespace std;

void print_order(char *str, char *begin)
{
	if (*begin == '\0')
		cout << str << endl;
	else
	{
		for (char *ch = begin; *ch != '\0'; ch++)
		{
			char temp = *ch;
			*ch = *begin;
			*begin = temp;

			print_order(str, begin + 1);

			temp = *ch;
			*ch = *begin;
			*begin = temp;
		}
	}
}
void main()
{
	char str[] = "abc";
	cout << str << endl;

	print_order(str, str);
}

题目39分析:(数组中出现次数超过一半的数字)
遍历数组中的数字,如果下一个数字和之前保存的目标数字相同时,则+1;如果不同时,则-1
思路:
1.初始化目标数字为第一个数字
2.从第二个数字开始遍历
3.若计算次数为0时,则替换目标数字
4.若相同,则+1

5.若不相同,则-1

#include <iostream>

using namespace std;

int get_more_half_num(int *arr, int length)
{
	//增强鲁棒性
	if (arr == NULL || length < 1)
		return 0;

	//1.初始化目标数字为第一个数字
	int goal_num = arr[0];
	int times = 1;

	//2.从第二个数字开始遍历
	for (int i = 1; i < length; i++)
	{
		//3.若计算次数为0时,则替换目标数字
		if (times == 0)
		{
			times = 1;
			goal_num = arr[i];
		}
		//4.若相同,则+1
		else if (goal_num == arr[i])
			++times;
		//5.若不相同,则-1
		else
			--times;
	}
	//检测此数组是否满足题目条件
	int test_times = 0;
	for (int i = 0; i < length; i++)
	{
		if (arr[i] == goal_num)
			++test_times;
	}
	if (test_times * 2 < length)
		return 0;
	return goal_num;
}
void main()
{
	int arr[] = {1,2,3,2,2,2,5,4,2};
	int length = sizeof(arr) / sizeof(arr[0]);
	int goal_num = get_more_half_num(arr, length);
	cout << goal_num << endl;
}

题目40分析:(最小的K个数)
对输入数组进行快排,直至获得前K个元素小于后面元素的索引
思路:
1.初始化第一次排序后的索引

2.排序获得划分索引,直至等于K-1

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

void swap(int *arr, int i, int j)
{
	int temp = arr[j];
	arr[j] = arr[i];
	arr[i] = temp;
}
int Partition(int *arr, int low, int high)
{
	int pivotKey = arr[low];//初始化序列第一个元素为枢轴变量  
	while (low < high)//轮询直至low==high  
	{
		while (low<high&&arr[high]>pivotKey)//r[high]大于枢轴值则向左移动  
			high--;
		swap(arr, low, high);//r[high]小于枢轴值则交换到前面  
		while (low < high&&arr[low] <= pivotKey)//r[low]小于等于枢轴值则向右移动  
			low++;
		swap(arr, low, high);//r[low]大于等于枢轴值则交换到后面  
	}
	return low;
}
void get_min_k(int *arr, int length,int k)
{
	if (arr == NULL || length < 1)
		return;
	
	//1.初始化第一次排序后的索引
	int start = 0, end = length - 1;
	int idx = Partition(arr, start, end);
	cout << idx << endl;
	//2.排序获得划分索引,直至等于K-1
	while (idx != k - 1)
	{
		if (idx > k - 1)
		{
			end = idx - 1;
			idx = Partition(arr, start, end);
		}
		else
		{
			start = idx + 1;
			idx = Partition(arr, start, end);
		}
	}

	for (int i = 0; i < k; i++)
	{
		cout << arr[i] << endl;
	}
}
void main()
{
	int arr[] = { 4,5,1,6,2,7,3,8 };
	int length = sizeof(arr) / sizeof(arr[0]);
	get_min_k(arr, length, 3);
}

猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/80794854
今日推荐