题目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);
}