当前位置: 首页 > news >正文

郴州网站制作设计/重庆seo代理计费

郴州网站制作设计,重庆seo代理计费,目前做啥网站能致富,什么程序做教育网站好经典面试题 之 数组的循环右移 题目的大意是将一个长度为n的数组A内的元素循环右移m位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}。 这题最平凡的做法是开另一个大小一样的数组B,遍历一下&#…

经典面试题 之 数组的循环右移

题目的大意是将一个长度为n的数组A内的元素循环右移m位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}。

这题最平凡的做法是开另一个大小一样的数组B,遍历一下,令B[(i + m) % n] = A[i],再将B的内容写回到A即可。这个方法的时间复杂度为O(N),空间复杂度也为O(N)。

很明显,需要优化空间的使用。有一种很优美但不太好懂的方法,是先将A的元素倒置,即{1, 2, 3, 4, 5}变成{5, 4, 3, 2, 1},然后将前m位倒置,即{3, 4, 5, 2, 1},再将后n-m位倒置,即{3, 4, 5, 1, 2}。完成。证明略,代码如下:

不过这种方法需要对每个位置写入2次,看上去也不怎么好,那有没有更好的呢?

我们要做的只是把每个元素放到它应该在的位置,比如开头的例子,1应该放在4的位置,把1放好之后,4就没地方了,那4应该在哪呢,在2的位置,以此类推,就可以把所有的元素都放好,而且只放了一次。看上去这样做很完美,但仔细想想就能想出反例子,比如{1, 2, 3, 4, 5, 6, 7, 8, 9}右移3位,就是1放在4个位置,4放在7的位置,然后7放回1,这时候一圈兜完了,但只排好了3个元素,剩下的6个元素没有动过,怎么办呢?继续下个呗,就是2,然后2、5、8也排好了,继续3、6、9,这时候下一个元素是1了(因为1之前就被放在了4的位置),应该停止了,那程序怎么会知道停在这里了,于是就想到了最大公约数,9和3的最大公约数是3,于是做前3个数的循环就可以了,为什么上一个例子只需做一次,因为元素个数(5)和移动位数(3)互质。

具体的数学证明略,直接上代码:

以下是测试数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void RunTest(int n, int m) {
  int *a = new int[n];
  int *b = new int[n];
  int *c = new int[n];
  for (int i = 0; i < n; ++i) {
    a[i] = i;
    b[i] = i;
    c[i] = i;
  }
  ShiftRight1(m, n, b);
  ShiftRight2(m, n, c);
  bool f = true;
  for (int i = 0; i < n; ++i) {
    if (b[i] != c[i]) {
      f = false;
      break;
    }
  }
  if (!f) {
    cout << "A: ";
    for (int i = 0; i < n; ++i) {
      cout << a[i] << " ";
    }
    cout << endl;
    cout << "B: ";
    for (int i = 0; i < n; ++i) {
      cout << b[i] << " ";
    }
    cout << endl;
    cout << "C: ";
    for (int i = 0; i < n; ++i) {
      cout << c[i] << " ";
    }
    cout << endl;
    cout << endl;
  }
  delete[]a;
  delete[]b;
  delete[]c;
}
int main(){
  for (int i = 1; i < 1000; ++i) {
    for (int j = 1; j <= i; ++j) {
      RunTest(i, j);
    }
  }
  return 0;
}

转载于:https://www.cnblogs.com/vectors07/p/8312705.html

http://www.jmfq.cn/news/4871071.html

相关文章:

  • 青岛网络服务公司/seo 网站优化推广排名教程
  • 回收那个网站做推广好/怎样做推广更有效
  • 装修公司网站开发/今日头条搜索引擎
  • 哪家公司做网站建设比较好/网络广告策划的内容
  • 郑州市做网站的公/优质友情链接
  • 五合一网站做优化好用吗/企业推广网站
  • 网站建设中 模版/什么是百度快照
  • 全网推广开户/seo tdk
  • 做网站需要哪些审核/搜索引擎营销方案例子
  • 关于网站建设live2500/站长工具高清无吗
  • 国内做网站建设好的/良品铺子网络营销策划书
  • php除了做网站/公司网站免费自建
  • 网站设计网站维护/推广seo网站
  • 建设小说网站用什么软件/搜什么关键词你都懂的
  • 泉州网站建设解决方案/网络营销建议
  • 什么是动态网页和静态网页/哈尔滨seo优化软件
  • 免费crm软件/优化关键词排名工具
  • 网站建设的方向和任务/国内免费建网站
  • 个人网站做公司网站/新公司怎么做网络推广
  • 宝鸡外贸网站建设/免费入驻的卖货平台
  • 建站主机/成人技术培训班有哪些种类
  • 怎么做传奇私服广告网站/百度网盟推广官方网站
  • 网站建设验收单格式/seo关键词排名工具
  • 响应式网站用什么开发的/百度搜索提交入口
  • 东莞小程序开发哪家好/丹东seo推广优化报价
  • c语言开发网站教程/长春网站提升排名
  • 我有网网站建设/漂亮的网页设计
  • 智能网站建设哪家好/旅游企业seo官网分析报告
  • 最好大连网站建设/郑州百度推广哪家好
  • 四川 优质高职建设网站/搜索引擎优化的报告