数据结构与算法解析习题2.7

发布于 2025-03-22 18:33 544 字 3 min read

前端项目通过bridge获取客户端资源,客户端直接返回response对象常用代码模板1——基础算法常用代码模板2——数据结构统计iOS工程代码行数高数概念、公式、定理Objective-C 语法 3Objective-C 语法 2Objective-C 语法 1UIViewController 的生命周期UITableview调用reload方法时抖动问题UILabel中文带行间距的处理,限制行数,计算高度等UIButton扩大点击范围以及关于响应者链条的思考UIApplicationSwiftUI基本控件iPhone6 Plus上面神秘的缝隙iPhone 刘海机型UI适配(X、Xs、Xs Max、Xr)iOS:如何在UITableView调用reloadData刷新结束后再同步执行后续操作iOS 截取整个 scrollview 图片iOS 关于 UITextField 的字数限制Objective-C 中禁止调用指定的方法objc源码分析-runtime-classObjective-C Type EncodingsObjective-C:为什么分类中不能直接添加属性OC优缺点以及常见bugruntime——运行时简单使用当对象接收到不能处理的消息时调用的方法浅谈iOS中的weak为 UIControl 实现线程安全的 Block 事件扩展:原理与实践OC单例宏iOS常用数据类型转换OC中nil 、NULL、 Nil 、NSNull的区别Description方法和NSLog函数Block in Objective-CiOS自动化埋点的实现iOS平台编译Ogre游戏引擎库iOS:特殊符号大全iOS 网络小结iOS 沙盒与 BundleiOS 框架学习-AsyncSocketNSString的各种处理Swift Module 如何被全局引用CocoaPods组件化——OC/Swift动静态库混用COCOAPODS技巧-创建私有仓库关于NSNotificationCenter数据结构与算法解析习题2.23数据结构与算法解析习题2.19数据结构与算法解析习题2.16数据结构与算法解析习题2.14数据结构与算法解析习题2.13数据结构与算法解析习题2.12数据结构与算法解析习题2.11:二分查找数据结构与算法解析习题2.10:霍纳法则(Horner's rule)数据结构与算法解析习题2.7数据结构与算法解析习题1.3数据结构与算法解析习题1.2数据结构与算法解析习题1.1LeetCode 486 Predict the Winner(预测赢家)LeetCode 398 随机数索引LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal(由中序和后序遍历建立二叉树)LeetCode 70 爬楼梯(青蛙跳台阶)LeetCode 8 String to Integer (atoi)LeetCode 6 ZigZag Conversion(Z字转换)LeetCode 5 Longest Palindromic Substring(最长回文字串)iOS脚本打包 ipa(.app转.ipa)《什么是数学 》习题 第一章 补充《什么是数学 》习题 第一章 2 数系的无限性 数学归纳法《什么是数学 》习题 第一章 1 整数的计算Vue 的一些指令和缩写
数据结构与算法解析习题2.7:前N个自然数的一个随机置换 问题描述:假设需要生成前N个自然数的一个随机置换。例如,{4,3,1,5,2} 和 {3,1,4,2,5} 就是合法的置换,但 {5,4,1,2,1} 却不是,因为数1出现了两次而数 3 缺没有。这个程序常常用于模拟一些算法。我们假设存在一个

数据结构与算法解析习题2.7:前N个自然数的一个随机置换

问题描述:假设需要生成前N个自然数的一个随机置换。例如,{4,3,1,5,2} 和 {3,1,4,2,5} 就是合法的置换,但 {5,4,1,2,1} 却不是,因为数1出现了两次而数 3 缺没有。这个程序常常用于模拟一些算法。我们假设存在一个随机数生成器 randInt(i, j) ,它以相同的概率生成 i 和 j 之间的一个整数。


#include <stdio.h>
#include <stdlib.h>

void swap (int *a, int *b) {

   int t;
   t = *a;
   *a = *b;
   *b = t;

}


int RandInt(int i, int j) {

   if (i == 0) {
       return rand() % (j + 1);
   } else {
       return rand() % (j + 1 - i) + i;
   }
}

// 1.如下填入 A[0] 到 A[N-1] 的数组 A;为了填入 A[i] ,生成随机数直到它不同于已经生成的 A[0], A[1],  ... ,  A[i-1] 时,再将其填入 A[i] 。

void fun1(int a[], int n) {

   int tmp;
   int i = 0;
   int j;
   while (i < n) {

       tmp = RandInt(0, n-1);


       for ( j = 0; j < i; j++) {
           if (tmp == a[j]) {
               break;
           }
       }

       if (j == i) {

           a[i] = tmp;
           i++;
       }
   }
}

// 2.同算法1,但是要保存一个附加的数组,称之为 Used(用过的)数组。
// 当一个随机数 Ran 最初被放入数组A的时候,置Used[Ran]=1。
// 这就是说,当用一个随机数填入 A[i] 时,可以用一步来测试是否该随机数已经被使用,而不是像第一个算法那样(可能)进行 i 步测试。

void fun2 (int a[], int n) {

   int tmp;
   int used[n];

   for (int i = 0; i < n; i++) {
       used[i] = 0;
   }

   int i = 0;

   while (i < n) {

       tmp = RandInt(0, n-1);

       if (used[tmp] == 0) {

           a[i] = tmp;
           used[tmp] = 1;
           i++;
       }
   }
}

// 3.填写该数组使得 A[i] = i + 1。然后
// for(i = 1; i < N; i++)
//     swap(&A[i], &A[randInt(0, i)]);

void fun3 (int a[], int n) {

   int i;

   for (i = 0; i < n; i++) {
       a[i] = i;
   }

   for (i = 0; i < n; i++) {

       swap(&a[i], &a[RandInt(0, i)]);

       for (int i = 0; i < n; i++) {
           printf("%d ", a[i]);
       }
       printf("\n \n");
   }

}






int main() {

   int a[5];
   fun3(a, 5);

   for (int i = 0; i < 5; i++) {
       printf("%d \n", a[i]);
   }
}