给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
这里实现第三种思路:
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void reverse(int* arr, int left, int right)
{
int tmp = 0;
while (left <= right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
void rotate(int *arr, int k, int sz)
{
k = k%sz;
reverse(arr, 0, sz - k - 1);
reverse(arr, sz - k, sz - 1);
reverse(arr, 0, sz - 1);
}
int main()
{
int k = 0;
int arr[] = { 1, 2, 3, 4, 5, 6 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("请输入要旋转几个位置:>");
scanf("%d", &k);
rotate(arr, k,sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void merge(int arr1[], int arr2[], int sz1, int sz2)
{
assert(arr1&&arr2);
int end1 = sz1 - 1;
int end2 = sz2 - 1;
int end = sz1 + sz2 - 1;
while (end1 >= 0 && end2 >= 0)
{
if (arr1[end1] > arr2[end2])
{
arr1[end] = arr1[end1];
end1--;
end--;
}
else
{
arr1[end] = arr2[end2];
end2--;
end--;
}
}
while (end2 >= 0)
{
arr1[end] = arr2[end2];
end2--;
end--;
}
}
int main()
{
int arr1[] = { 1, 2, 3 };
int arr2[] = { 4, 5, 6 };
int sz1 = sizeof(arr1) / sizeof(arr1[0]);
int sz2 = sizeof(arr2) / sizeof(arr2[0]);
merge(arr1, arr2, sz1, sz2);
int i = 0;
for (i = 0; i < sz1+sz2; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
int strStr(char* s1, char* s2)
{
assert(s1&&s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
char* cp = s1;
char* start = cp;
while (*cp)
{
char* p1 = cp;
char* p2 = s2;
while ((*p1 != '\0') && (*p2 != '\0') && (*p1 == *p2))
{
p1++;
p2++;
}
if (*p2 == '\0')
{
int ret = cp - start;
return ret;
}
cp++;
}
if (len2 == 0)
{
return 0;
}
else
return -1;
}
int main()
{
char arr1[] = "bit edcuation";
char arr2[] = "bit";
int ret = strStr(arr1, arr2);
printf("%d\n", ret);
return 0;
}
以上就是今天要讲的三道题目,本文仅仅简单三道题目的解法,这些题目在我们以后面试时可能会遇到,我们务必掌握。另外,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。
Go原生就支持连接数据库,所以在使用 Golang 开发时,当需要数据库交互时,即可...
3月22日消息 外媒 Winfuture 报道,此前微软面向 Insider 预览用户公布了 Window...
橡皮擦一个逗趣的互联网高级网虫。 观前提醒本篇文章涉及知识点巨大建议先收藏再...
本文实例讲述了正则表达式中的操作符及说明。分享给大家供大家参考,具体如下: ...
这些日子一直在简书上使用markdown写作,已经渐渐的痴迷于这种简洁纯粹的写作方...
1 . 目标 演示下图的git reset 各选项的效果。 2. Git Reset操作说明 图中说明:...
Greediness(贪婪型):最大匹配 X、X*、X+、X{n,} 是最大匹配。例如你要用 “....
从另一台机器上复制过来的项目,由于两台机器的库目录不一致,导致了stdio.h等很...
ajax 实现三级联动,相当于写了一个小插件,用的时候直接拿过来用就可以了,这里...
2月23日消息 据外媒 Windows Latest 今日报道,借助 Windows 10 Sun Valley 更新...