精华内容
下载资源
问答
  • 面向过程 : 按步骤进行执行, 面向对象 : 按对象... 面向过程: 时间 = 路程 / 速度 数学思维 面向对象: 有一个车(名字:法拉利,速度:200KM/h) 跑, 一要路(长度: 10000KM) 盖房子: 备料-...

    面向过程 : 按步骤进行执行,
    面向对象 : 按对象的功能进行调用,

    		让一辆法拉利以200KM/h 路在一条10000KM的路,问需要多少时间?
    		面向过程: 时间 = 路程 / 速度      数学思维
    		面向对象: 有一个车(名字:法拉利,速度:200KM/h)   跑,
    		         一要路(长度: 10000KM)
    				 
    				 
    				 
    		盖房子:  备料-打地基-砌墙-封顶-装修       亲力亲为的体验,
    		盖房子:  工程队    装修公司              指挥者的体验
    
    展开全文
  • 数据思维

    2021-01-27 11:47:13
    业务问题,定义成数据问题,然后数据分析员处理,分析的过程叫回归分析; 核心业务抽象出Y坐标,然后分析因素抽象为x 轴,把x和y关系说明清楚,交给专业人员去处理; 【举例】 文案影响,分析出多个指标,...

    最近听的一本书,《数据思维》:分享一下

    1.【数据定义】

         能被电子化的叫做数据,滴滴司机数据化,ofo数据化,堵车数据化,太形象了,数据以后会是电;
         注意!数据与自己业务相关诉求,比如淘宝,谷歌,他们案例不能复制的;

    2.【业务问题,定义成数据问题】

        业务问题,定义成数据问题,然后数据分析员处理,分析的过程叫回归分析;
        核心业务抽象出Y坐标,然后分析因素抽象为x 轴,把x和y关系说明清楚,交给专业人员去处理;

    【举例】
            文案影响,分析出多个指标,评判出那些文案好;即老总指出,粉丝增多从文案分析;

    【建立x和y关系】
           建立y和x建立关系,比如x一个因素打分,分类出高价值用户或者将低价值用户培养成高价值用户; 最终目标,数据不断打磨,最后为每个客户提供便捷生活福利;
    3.【有了模型,怎么产生产品和实施】
    比如公交汽车,油耗很多,分析发现是公交出战时;

    4【数据分析产生价值是有极限的】

     给定x和y达成的结构magin是有限的,数据产品商业化过程,有一定瓶颈,通过产品创新业务改变提高盈利;

     要意识到大数据,测评的实现平均的不准,只能实现平均的盈利;要认可大数据的的不准确;
    【举例】
            特朗普大选,谷歌,youtbo越是大数据磨平误差,只能代表一部分;
           注意!!大量的模型是相关关系,但因果关系很重要;
    因果关系比较奢侈,大部分统计学是相关关系;

    4.【回归分析定义】
    只要有y和x都觉回归分析,非线性分析,线性分析,深度学习;

     关键是:从业务反馈到数据可分析问题;

     

    展开全文
  • 需要发散思维学习PHP

    2021-01-20 00:26:28
    我觉得在学习的过程中,大家要知道“玩”,制造点成就感,那样的话 学习的效果和热情就会很高涨, 就会更喜欢自己学习的东西! 举例说明: 今天学习PHP的图像函数部分,学习了几个函数,他们分别是: getimagesize()...
  • 如果面试者能将求解过程从暴力法优化到双指针,说明面试者基础知识、代码能力、逻辑思维都是十分扎实。同贪心算法一样,双指针难点在于自己想不出、别人理解不了、正确性难以证明。常用双指针法有以下几类...

        使用双指针是降低算法复杂度的一个有效途径,有些问题的暴力解法时间复杂度是O(n^2),但使用双指针可以大幅度降低算法复杂度。如果面试者能将求解过程从暴力法优化到双指针,说明面试者的基础知识、代码能力、逻辑思维都是十分扎实的。

        同贪心算法一样,双指针的难点在于自己想不出、别人的理解不了、正确性难以证明

    常用的双指针法有以下几类:

    左右指针:两个指针,相向而走,中间相遇。

    快慢指针:两个指针,有快有慢,同向而行。

    灵活运用:两个指针,灵活运用,伺机而动。

    下面将结合具体题目,从暴力做法一步一步优化到双指针,攻克想不出、看不懂、不会用的难题。

    左右指针

        左右指针地熟练使用需要一定经验的积累,如果接触的较少,是不容易想出来的。下面将以题目为例,一步步从暴力解法优化到双指针。

    思路:先找出暴力解法,根据题目性质,优化到双指针

    例题一:盛最多水的容器

        给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为(i, ai)(i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

    6550ff877a923ae43f81cea41174bc28.png

    示例 :

    输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

        这道题的最优解法是左右双指针法。双指针法的难点在于难于想到,难以证明。接下来将一步一步地从暴力解法优化到双指针法。证明也就很简单了。

    暴力法:

    找出每一种情况,求出盛水值,最大的就是答案。

    1. i指向左挡板,从第一块遍历倒数第二块。

    2. j指向右挡板,从倒数第一块遍历到i后面那一块。

    3. res保存最大盛水值。

    4. 返回res

    代码:

    //cppclass Solution {public:   int maxArea(vector<int>& height) {       if(height.size() <= 1) return 0;       int res = 0;//保存结果       for(int i = 0; i < height.size() - 1; i++)//以i为左挡板,从O开始      {           for(int j = height.size() - 1; j > i; j--)//以j为右挡板,从height.size() - 1开始          {               int L = j - i;//底边长度               int H = min(height[i], height[j]);//对短的挡板为高               res = max(res, L * H);//取最大值          }      }       return res;  }};

        用S[l,r]表示以第l块板为左挡板,第r块板为右挡板的盛水值。S[l, r]就等于min(height[l], height[r]) / (r - l)

    以输入[1,8,6,2,5,4,8,3,7]为例,共8块挡板,看看都计算了哪些值:

    15f2b6e89a60546d1fc3f69abb12c806.png

    优化:

    1. 开始时,l指向第0块挡板,r指最后一块挡板。S[l, r]=min(1, 7) * (8 - 0) = 8

    b95ffef1d7d29966e93abc389032be70.png

    2. 向内移动指向较长挡板的r指针,盛水面积不会变大。

    盛水值S[l, r] = min(height[l], height[r]) / (r - l)

    向内移动r指针的时候min(height[l], height[r]) 不会大于height[l],也就是不会大于7。(r - l)会随着r内移减小。

    所以向内移动r指针的时候,盛水值不可能变大。也就是S[0,8]肯定大于S[0,7],S[0,6],S[0,5],S[0,4],S[0,3],S[0,2],S[0,1]

    因此知道了以height[0]为左挡板的最大盛水值。以后计算就不用考虑height[0]了

    10ccf9d44eee3345a5b85d18c370f60f.png

    3. 子问题就变成了:在[8,6,2,5,4,8,3,7]中求出最大盛水值,然后与刚才的求出的以height[0]为左挡板的最大盛水值比较大小,大的为答案。

    634e7a6ebd0446a8a2ee3b42b900e1ea.png

    4. 子问题求解时,用l指向指向第0块挡板,也就是height[1]r指最后一块挡板,也就是height[8]S[l, r]=min(8, 7) / (8 - 1) = 56

    这个时候,如果向内移动指向较长挡板的l指针,盛水面积不会变大。

    因为向内移动l指针的时候,盛水值S[l, r] = min(height[l], height[r]) / (r - l)min(height[l], height[r]) 不会大于height[r],也就是不会大于7。(r - l)会随着l内移减小。

    所以向内移动l指针的时候,盛水值不可能变大。也就是S[1,8]肯定大于S[2,8],S[3,8],S[4,8],S[5,8],S[6,8],S[7,8],就知道了以height[8]为右挡板的最大盛水值。

    176eb6b8e86dbb80e53cb1c264cca5e7.png

    5. 子问题可以再次缩小,就变成了:在[8,6,2,5,4,8,3]中求出最大盛水值,然后与刚才的求出的以height[0]为左挡板的最大盛水值,以height[8]为右挡板的最大盛水值比较大小,大的为答案。

    6. 以此类推,每次就能求出以最外侧两个挡板中,短的挡板为边界的最大值。然后再依次缩小问题。就不需要计算所有的情况了,只需要计算出每块挡板为边界的最大值,然后求出其中的最大值,就是答案。

    7. 这样下去,求解空间就变为了:

    aa52711774c59f2fe59b65ab5fd65062.png

    代码:

    //cppclass Solution {public:   int maxArea(vector<int>& height) {       if(height.size() <= 1) return 0;       int res = 0;//保存答案       int l = 0, r = height.size() - 1;//开始时,l指向最左边的挡板,r指向最右边的挡板       while(l < r)//如果l,r之间还有挡板      {           res = max(min(height[l], height[r]) * (r - l), res);//计算盛水值           if(height[l] <= height [r])//谁小谁以后就不用再考虑                l++;           else               r--;      }       return res;  }};

    时间上,l,r指针遍历一遍,所以时间复杂度是O(n)。空间上,没有开辟与输入有关的空间,所以空间复杂度是O(1)。

    例题二: 和为s的两个数字

        输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

    示例 :

    输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]

    暴力法:

    穷举出每一种情况,如果两数之和等于target的,输出答案。

    1. i指向数对的第一个数字,从0nums.size() - 2;

    2. j指向数对的第二个数字,从nums.size() - 1i+1;

    3. 如果nums[i] + nums[j] == target,返回[nums[i], nums[j]]

    代码:

    //cppclass Solution {public:   vector<int> twoSum(vector<int>& nums, int target) {       for(int i = 0; i < nums.size() - 2; i++)//i指向数对的第一个数字,从0到nums.size()-2      {           for(int j = nums.size() - 1; j > i; j--)//j指向数对的第二个数字,从nums.size()-1到i+1          {               if(nums[i] + nums[j] == target)//如果两数之和等于target                   return vector<int>{nums[i], nums[j]};//返回数对          }      }       return vector<int>{-1, -1};//穷举完没有答案,返回[-1,-1]  }};

    两个遍历数组的循环,所以时间复杂度是O(n^2);没有开辟与数组大小相关的空间,所以空间复杂度是O(1)

    优化一:j不用走到i+1再结束

        暴力法没有用到数组有序这个条件,第一次优化利用了数组有序这个性质。

        因为数组有序,所以nums[j] > nums[j-1]。若nums[i] + nums[j] < target,则nums[i]nums[j-1]后面的数一定小于target。所以j不用从nums.size()-1遍历到i+1,只需要遍历到nums[i] + nums[j] < target即可。

    举例:nums = [1,4,6,7,8,11]target = 10

    第一次遍历:i = 0, j = 5开始,当 j减小为4的时候,nums[0] + nums[4] = 1 + 8 = 9 < target

    45f0b5287d29c4f1f503cd3a00236d0b.png

    数组有序,所以nums[2] < nums[3] < nums[4]j往前走,nums[j]的值会一直变小,nums[i] + nums[j]一定小于target。所以j的这次循环可以停止了。

    代码:

    //cppclass Solution {public:   vector<int> twoSum(vector<int>& nums, int target) {       for(int i = 0; i < nums.size() - 2; i++)//i指向数对的第一个数字,从0到nums.size()-2      {           for(int j = nums.size() - 1; j > i; j--)//j指向数对的第二个数字,从nums.size()-1到i+1          {               if(nums[i] + nums[j] == target)//如果两数之和等于target                   return vector<int>{nums[i], nums[j]};//返回数对               if(nums[i] + nums[j] < target)//当两数之和小于target的时候,nums[j]左侧的数字加nums[i]一定小于target,可以跳出循环。                   break;          }      }       return vector<int>{-1, -1};//穷举完没有答案,返回[-1,-1]  }};

    虽然能提前跳出j的循环,但是时间复杂度和空间复杂度都没有变。

    优化二:j不用每次都从nums.size()-1出开始

        数组有序,所以nums[i + 1] > nums[i]。如果nums[i] + nums[j] > target, 则nums[i + 1] + nums[j]一定大于target

        程序执行过程中,当第一次遇到nums[i] + nums[j] < target 的时候,j的这次遍历结束。此时,nums[i] + nums[j + 1]是大于target的。

        程序执行i + 1,i指向后一个元素,此时,nums[i] + nums[j + 1]肯定大于target。所以j不用从nums.size() - 1重新开始遍历,只需要从当前位置往前遍历即可。

    举例:nums = [1,4,6,7,8,11],target = 10

    第一次遍历:i = 0,j = 5开始,当j 为5的时候,nums[0] + nums[5] = 1 + 11 = 12 > targetj向左移动一格后,j = 4

    54439cc3021441c1b7d139d8e43770a0.png

    j为4的时候,nums[0] + nums[4] = 1 + 8 = 9 < targetj的此次遍历结束。这个时候,nums[i] + nums[j] < target, nums[i] + nums[j + 1] > target

    c3c17f008348374d7ed8021c458101c9.png

    程序继续,执行i+1:i = 1。数组有序,所以nums[1] > nums[0]。因为nums[0] + nums[5] > target, 所以nums[1] + nums[5]肯定大于target,所以j不用从5开始往后遍历,从上次位置继续往后遍历即可。

    代码:

    //cppclass Solution {public:   vector<int> twoSum(vector<int>& nums, int target) {       int j = nums.size() - 1;       for(int i = 0; i < nums.size() - 2; i++)i指向数对的第一个数字,从0到nums.size()-2      {           while(nums[i] + nums[j] > target)//j一直往前走即可               j--;           if(nums[i] + nums[j] == target)               return vector<int>{nums[i], nums[j]};      }       return vector<int>{-1, -1};  }};

    i0nums.size() - 2过程中,j只遍历了一次,所以时间复杂度O(n);没有开辟与数组大小相关的空间,所以空间复杂度是O(1)

    小结

        左右双指针法的实质是合理利用题目的规则,减少遍历的次数,从而降低时间复杂度。可以从暴力出发,想办法利用题目规则,一步一步进行优化。

    快慢指针

        快慢指针是指移动的步长,即每次向前移动速度的快慢。(例如,让快指针每次前移动2步,慢指针每次向前移动1步)。

    例题一:链表的中间结点

        给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

    示例 :

    输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。

    暴力法:

    1. 用一个指针遍历一遍链表,求出链表的最后一个节点编号:n(节点编号从0开始)。

    2. 中间节点在第n/2向上取整的位置。

    3. 用一个指针从表头往后走n/2向上取整步,指向的节点就是答案。

    代码:

    //cppclass Solution {public:    ListNode* middleNode(ListNode* head) {        if(!head) return NULL;        int n = 0;//保存节点编号        ListNode *p = head;        while(p->next)        {            n ++;            p = p->next;        }                int mid = (n + 1 ) / 2;//中间节点位置。(len + 1 ) / 2 = len/2 向上取整。        p = head;        while(mid -- )//走mid步及为中点        {            p = p->next;        }        return p;    }};

    时间上遍历两遍链表,所以时间复杂度是O(2n);没有开辟与链表相关的空间,所以空间复杂度是O(1)。

    优化:快慢指针法

        想象两个人比赛跑步,一个人的速度是另一个人的2倍,当速度快的到达终点的时候,速度慢的人肯定在赛道中点。

        同理:用两个指针 slowfast 一起遍历链表。slow 一次走一步,fast 一次走两步。当 fast 到达链表的末尾时,slow 必然位于中间。

    aac5bb464a9b5b8b7f46a356377cae58.gif

    代码:

    //cppclass Solution {public:    ListNode* middleNode(ListNode* head) {       if(!head) return NULL;       ListNode *fast, *slow;       fast = head;       slow = head;       while(fast->next)       {           fast = fast->next;           if(fast->next) fast = fast->next;//fast走两步           slow = slow->next;//slow走一步       }       return slow;    }};

    时间上遍历一遍链表,所以时间复杂度是O(n);没有开辟与链表相关的空间,所以空间复杂度是O(1)。

    例题二:环形链表

    暴力法

        遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。

        具体的,使用哈希表来存储所有已经访问过的节点。每次到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到遍历完整个链表即可。

    //cppclass Solution {public:    bool hasCycle(ListNode *head) {        unordered_set h;//保存访问过的节点        while (head != nullptr) {            if (h.count(head)) {//如果当前访问节点在h中,则有换                return true;            }            h.insert(head);//将当前节点放入h            head = head->next;        }        return false;    }};

    时间上遍历一遍链表,所以时间复杂度是O(n);开辟了存储访问过的节点的哈希表,与链表线性相关,所以空间复杂度是O(n)。

    优化

        想像两个人从宿舍同时出发去操场跑步,一个人的速度快,一个人的速度慢。经过一段时间后,这两个人总能在操场相遇。

        同理:指针fastslow在链表上移动,fast移动的快,slow移动的慢。当fastslow从链表上的同一个节点开始移动时,如果该链表中没有环,那么fast将一直处于slow 的前方;如果该链表中有环,那么fast会先于slow 进入环,并且一直在环内移动。等到slow 进入环时,由于fast的速度快,它一定会在某个时刻与slow相遇。

    a94019533f5dcfdfe83b74163e052723.gif

    代码:

    //cppclass Solution {public:    bool hasCycle(ListNode* head) {        if (head == nullptr || head->next == nullptr) {            return false;        }        ListNode* slow = head;//定义慢指针        ListNode* fast = head->next;//定义快指针        while (slow != fast) {//相遇一直走            if (fast == nullptr || fast->next == nullptr) {//如果无环,fast会走完链表,为空,返货false                return false;            }            slow = slow->next;//慢指针一次走1步            fast = fast->next->next;//快指针一次走2步        }        return true;    }};

    时间上遍历一遍链表,所以时间复杂度是O(n);没有开辟与链表相关的空间,所以空间复杂度是O(1)。

    小结

        快慢指针在解决链表的某些问题的时候,有着很好的效果。可以把题目抽象成生活案例,想想如何解决,一般就能找出解法了。

    灵活运用

    例题一: 链表中倒数第k个节点

        输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

    示例 :

    给定一个链表: 1->2->3->4->5, 和 k = 2.
    返回链表 4->5.

    朴素地做法

    1. 用一个指针遍历一遍链表,求出链表长度:n

    2. 用一个指针从链表头开始往后走n - k 步,即可找到链表倒数第 k个节点。

    //cppclass Solution {public:    ListNode* getKthFromEnd(ListNode* head, int k) {        if(!head) return NULL;        int len = 1;//记录链表长度.        ListNode *p = head;        while(p->next)        {            len++;            p = p->next;        }        p = head;        while(len - k)        {            p = p->next;            len --;        }        return p;    }};

    时间上遍历两遍链表,所以时间复杂度是O(2n);没有开辟与链表相关的空间,所以空间复杂度是O(1)。

    双指针法

        前指针 f( former首字母)、后指针l(latter首字母) ,双指针都指向头节点 head构建双指针距离:前指针先向前走k步,结束后,双指针fl 间相距 k步。双指针共同移动:指针fl每轮都向前走一步,直至 f走过链表尾节点时跳出。跳出后,l与尾节点距离为k-1,即 l指向倒数第 k 个节点。

    1f367271833c91636e408119a8d2c706.gif

    代码:

    //cppclass Solution {public:    ListNode* getKthFromEnd(ListNode* head, int k) {        if(!head || k <= 0) return NULL;    //特殊情况判定        ListNode *f = head, *l = head;        while(k--)          {            if(!f)  return NULL;                f = f->next;//将p移动到第k+1个节点,默认k小于链表长度        }        while(f)//离开循环时f=null,为第n+1个节点,l此时在1+(n+1)-(k+1)的位置上,正好是目标节点        {            f = f->next;            l = l->next;        }        return l;    }};

    时间上遍历一遍链表,所以时间复杂度是O(n);没有开辟与链表相关的空间,所以空间复杂度是O(1)。

    例题二:反转字符串中的元音字母

        编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

    示例 :

    输入:"hello"
    输出:"holle"

    双指针法

        定义指针i,j, 初始化时指针i = 0, j = s.length() - 1;指针i开始从左到右遍历以找到第一个元音字符,指针j开始从右到左遍历以找到第一个元音字符;交换指针i与指针j锁指向的元音字符即可;指针i和指针j在遍历过程中要注意数组越界情况。

    //cppclass Solution {    // 判断一个字符是否是元音字母    public:        bool isVowel(char c) {            return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'                    || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' ;        }    public:        string reverseVowels(string s) {            int i = 0,j = s.size() - 1;            while(i < j){                if(!isVowel(s[i])){//让i指向元音                    i++;                    continue;                }                if(!isVowel(s[j])){//让j指向元音                    j--;                    continue;                }                swap(s[i++],s[j--]);//交换            }            return s;        }};

    时间上遍历一遍链表,所以时间复杂度是O(n);没有开辟与链表相关的空间,所以空间复杂度是O(1)。

        欢迎订阅,往期内容也很精彩。每周更新面试高频算法题。从思路,代码,时间复杂度等多方面进行分析。

        后台点击电子书可以获得:halfrost大神的孔雀书,经典巨著:算法导论。

    715fa4da98eb3d8dc51897917bd201f8.png
    展开全文
  • 我觉得在学习的过程中,大家要知道“玩”,制造点成就感,那样的话 学习的效果和热情就会很高涨,就会更喜欢自己学习的...举例说明: 今天学习PHP的图像函数部分,学习了几个函数,他们分别是: getimagesize...

    我觉得在学习的过程中,大家要知道“玩”,制造点成就感,那样的话 学习的效果和热情就会很高涨,
    就会更喜欢自己学习的东西!

    举例说明:

    今天学习PHP的图像函数部分,学习了几个函数,他们分别是:

    getimagesize()

    array getimagesize ( string $filename [, array &$imageinfo ] )
    getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

    imagecreatefromgif()

    resource imagecreatefromgif ( string $filename )
    imagecreatefromgif() 返回一图像标识符,代表了从给定的文件名取得的图像。
    意思就是以后为了方便使用这个图片资源,这个函数返回一个操作的句柄。
    类似的函数还有imagecreatefromjpeg(),imagecreatefrompng()  当然还有很多,大家可以看官方在线手册

    imagecolorat()

    int imagecolorat ( resource $image , int $x , int $y )
    返回 image 所指定的图形中指定位置像素的颜色索引值。

    imagecolorsforindex()

    array imagecolorsforindex ( resource $image , int $index )
    本函数返回一个具有 red,green,blue 和 alpha 的键名的关联数组,包含了指定颜色索引的相应的值。

    大家看了一段生硬的介绍,估计困了,不过请坚持一下!

    那么学了这几个函数后,怎么练习一下呢?
    其实我学到这几个函数,就立即想到了一个很好玩的东西可以做!
    是什么?你猜猜~!!!!
    看代码:

    <?php
        $url    = "logo-yy.gif";
        $size   = getimagesize($url);
        $width     = $size[0];
        $height = $size[1];
        $im     = imagecreatefromgif($url);
       
       
        for($y=1;$y        for($x=1;$x            $color_index = imagecolorat($im, $x, $y);
                $color_tran = imagecolorsforindex($im, $color_index);
                echo("");
                echo("爱");
                echo("
    ");
            }
                echo("
    ");
        }
    ?>

    要注意的是我的程序里用的函数是imagecreatefromgif()
    所以变量$url指向的文件应该是GIF格式的,如果想指向JPG格式的文件要用imagecreatefromjpeg()
    当然我们可以写在一起,因为第一个函数就可以判断图片的格式,我在这里就不写了!!哈哈
    好了,有php环境的赶紧试试是什么吧!呵呵

    不建议用太大的图片!小logo就好了!
    不然,你可别怪我没告诉你啊!
    这个例子没什么实际用途!!但是他可以激发大家学习的乐趣!!
    献给正在学习PHP的人!

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14883374/viewspace-414988/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/14883374/viewspace-414988/

    展开全文
  • 一、 面向对象 面向对象概述:面向对象是基于面向过程的,...面向对象举例说明: ① 电脑城买电脑:假如我想买一台电脑,因为并不懂电脑,所以我可以找懂电脑人帮我去做一些事情,首先,先让他在网上查硬件性价
  • 数据(data)信息(information)知识(knowledge)与价值(value)这四个词 在信息科学中既相关联又具有不同含义请举例说明四个概念关联与区别 参考答案数据体现是一种过程状态或结果记录这类记录数字化 ...
  • 04_面向对象概述

    2015-08-31 13:19:04
    一、面向对象思想的简单概述 面向对象是Java基础学习过程中...A:比如洗袜子过程,如果要完成这一整件事情,那么我们的过程是:   面向过程:脱了-->泡一泡-->扭一扭-->搓一搓-->漂洗-->晾干   我们
  • 一、面向对象思想的简单概述 ...A:比如洗袜子过程,如果要完成这一整件事情,那么我们的过程是:   面向过程:脱了-->泡一泡-->扭一扭-->搓一搓-->漂洗-->晾干   我们如果要偷懒,想简化过程,此时
  • 栅格系统强大之处在于灵活处理不同分辨率下页面布局,对于我这种理科思维并且是前端弱鸡人来说,优点在于可预见、可控,同时最大限度减少了页面布局过程代码量,实乃神器。 举例说明: <div class...
  • 面向对象

    2020-06-23 22:46:21
    举例说明:比如要开车,我们可以分为几步,1.踩离合,打火,2.打转向灯,挂挡,3.松离合至车抖,放手刹,加油,5.松离合,车就走了。这就是面向过程。 但要是需要造一辆车,那就要复杂多,不能说先造什么,只能是...
  • 举例说明科学如何为工程服务。第三章(技术与工程师)工程师做什么?什么是经验知识?工程师应该拥有怎样工作态度? 一、第一章(绪论) 1、什么是工程技术? 工程技术,指是工程实用技术。工程技术亦称生产...
  • 画图习惯与速度

    2020-12-09 11:44:22
    本文通过举例说明个人操作习惯与速度关系。[正文]在使用相同软件进行layout时,影响画图速度一些因素可能有:对软件菜单熟悉程度,自定义合理性和操作习惯。对于第三方面而言,不同人有着明显差异性;同...
  • 前段时间,在使用了一段时间MVVM架构之后,我从实际项目中抽离出来,对使用MVVM架构整个过程进行了总结,对于架构、对于编程思维又有了不一样体会。于是提笔写下自己探索MVVM架构经验和心得,以飨读者。...
  • 这是一个菜鸟产品经理写给她菜鸟产品助理入职培训教材,教材分为“习惯”“流程”“文档”“产品思维”等几个部分。...举例一个故事来进行产品开发过程的说明: 一个动机 盘古开天辟地后,女神女娲在茫...
  • 企业运维安全探讨

    2013-02-02 18:49:29
    HAWK与大家一起分享企业在安全运维过程各类问题实践,就企业网络安全新形式、企业安全现状举例说明,对企业安全难点以新的思维方式、观点做全面阐述,对企业在安全运维过程中出现各类问题提出合理性、建设...
  • 摘要:本实验通过举例创建一个数据库、一张有定义表、以及添加数据到该表实验过程,能让初学者掌握使用数据库DDL语言创建数据库和基本表逻辑思维和操作步骤。 一、实验目的 掌握使用数据库DDL语言创建数据库...
  • VC51中文标识符工具

    2012-08-01 11:18:44
    说白了,就是在IDE前台和C51的通信之间进行“传话”,在传话的过程中,我们作手脚。 下边就说怎么作手脚了。前文已经说了,我们的中文标识符必须按照“nameof(“变量名字符串”)”的格式。我们复制的时候,把所有...
  • 老男孩 培训 28期

    2019-04-28 13:31:57
    0013-同学们要学习内容重点举例说明__rec 0014-如何学好linux运维学习思想__rec 0015-如何拿到高薪重要思想__rec 0016-如何学好linux运维之学习方法习惯讲解__rec 0017-如何轻松记住学习内容__rec 0018-如何学好...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    体验创造快感的激动人心的过程. 为能和大家能共同探讨"设计模式",我将自己在学习中的心得写下来,只是想帮助更多人更容易理解 GoF 的《设计模式》。由 于原著都是以C++为例, 以Java为例的设计模式基本又都以图形应用...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    本书中面试题不但以实例代码形式对答案进行了详细解析,还对问题相关知识点进行了扩展说明。希望通过本书,读者可以成功应聘,并提升综合素质。本书适合应聘C/C++职位程序员阅读,也适合其他程序员作为拓展...
  • 简单举例说明其应用 …… 面试题224 关于ISO七层模型典型问题 面试题225 内存分配方式及其区别 面试题226 struct和class区别 …… 面试题229 比较C++中4种类型转换方式 面试题230 面向对象3个基本特征是...
  • git团队协作项目操作说明.md 放在博客上外链 Linux系统下开发环境搭建 Win10下安装双系统Deepin 15.8.md Deepin15.8下搭建Python开发环境.md 含有如何在Deepin Linux下安装pip、pip3 安装pycharm、jupyter...
  • * 开 发 商: 创思维软件工作室 * 更新时间: 2010-09-22 * 应用平台: Win9X/Win2000/WinXP/Win2003/Vista/Wind7 Excel集成工具箱8.0是利用VBA(Visual Basic for Applications)语言编写增强应用型插件。...
  • * 开 发 商: 创思维软件工作室 * 更新时间: 2010-09-10 * 应用平台:Win7/Vista/Win2003/WinXP/Win2000/Win9X Excel集成工具箱8.0是利用VBA(Visual Basic for Applications)语言编写增强应用型插件。包括...
  • * 开 发 商: 创思维软件工作室(梁瑞春) * 更新时间: 2011-01-06 * 应用平台: Win9X/Win2000/WinXP/Win2003/Vista/Wind7 Excel集成工具箱9.0是著名微软办公软件EXCEL(Microsoft Office for EXCEL)增强型插件...
  • 需要发散思维学习PHP发布时间:2016-06-17 来源: 点击:次我觉得在学习的过程中,大家要知道“玩”,制造点成就感,那样的话 学习的效果和热情就会很高涨,就会更喜欢自己学习的东西!举例说明:今天学习PHP的图像...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

思维的过程举例说明