精华内容
下载资源
问答
  • 展开全部Leetcode上:从排序数组中删除重复项// nums 是以“引用”方636f707962616964757a686964616f31333365663433式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里修改输入...

    展开全部

    Leetcode上:从排序数组中删除重复项

    // nums 是以“引用”方636f707962616964757a686964616f31333365663433式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。for (int i = 0; i < len; i++) {    print(nums[i]);

    }

    我当时的解决方法:class Solution:

    def removeDuplicates(self, nums):

    """

    :type nums: List[int]

    :rtype: int

    """

    nums = list(set(nums))        return len(nums)

    然而这个方法一直没通过,我看了测试过程后才发现原来nums并没有被修改。这是为什么呢?原来 nums = list(set(nums)) 这个被重新赋值的nums并不是指向的原来传进来的nums 的地址,set()后重新申请了一块空间,然后list()又重新申请了一块空间,最后将nums指向这个空间当然就不是原来的实参(形参)原来的空间了,自然实参的值没有得到改变。

    python中不需要像C++中那样传引用或是传地址,而是只用在函数内对传进来的变量重新赋值即可,python函数传参的过程可看做是深拷贝,地址是相同的,所以可以通过改变形参的值来改变实参的值。但是如果是整型是不可以的。

    a = 1print(id(a)) =>1624465632def do1(nums):

    nums = 2do1(a)

    print(id(a)) =>1624465632print(a)    => a=1----

    b = [1,2]

    print(id(b)) =>2578463263304def do2(list):

    list.append(3)

    do2(b)

    print(id(b)) =>2578463263304print(b)   => [1,2,3]

    a=1只是a引用了1,指向了1这个地址。10的引用计数位0的时候,解释器会自动回收。

    当然这跟python中整型分配内存空间的方式也有关。

    num = 10print(id(num))

    print(id(10) )

    #=>结果是相同的.

    #num_2=10 id(num_2)=id(num)=id(10)

    更进一步说明:print(num is 10) # => True

    其中操作符is的作用就是判断两个是否指向同一个内存。在python中,相当于给"10"这个数值分配了内存,然后让变量"num"去指向“10”(可以看做是指针),num可以看做是10的引用。而python中的id()则可以用来查询地址。

    在python中,一开始初始化存储在内存的东西是不可以更改的,python中对内存的操作是由解释器来管理的。对于整型来说,我们并不能改变地址,我们所能更改的只是它的指向。

    然而对于python的内置数据类型如列表list(),字典{},集合{}来说。又是另外一种情况。

    list1 = [1,2,3]

    list2 = [1,2,3]print(id(list1) )   # =>1904062761544print(id(list2) )   # =>1904062762952print(id([1,2,3]))  # =>1904092664008#=>结果是不同的.

    更进一步说明:print(list1 is list2) # => False

    Python中list内存的分配方式是动态的:

    创建时:if (numfree) {

    numfree--;

    op = free_list[numfree];

    _Py_NewReference((PyObject *)op);

    } else {

    op = PyObject_GC_New(PyListObject, &PyList_Type);    if (op == NULL)        return NULL;

    }

    resize时:

    new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);    /* check for integer overflow */

    if (new_allocated > PY_SIZE_MAX - newsize) {

    PyErr_NoMemory();        return -1;

    } else {

    new_allocated += newsize;

    }

    即使是相同内容的列表,但他们的地址是不同的,相当于仅仅是一次浅拷贝。

    至于为什么整型、元组不能改变他们内存上的值,而字典、列表可以,我个人认为主要还是python对它们内存管理方式上的不同。学识尚欠,不敢误言,以后整明白了再补上吧。

    Python sys.getsizeof(int())

    print(id(2)) #=>1624465664

    print(id(3)) #=>1624465696

    print(id(4)) #=>1624465728

    发现整型地址之间只差了32,这似乎意味着在64位里python是占4字节的。于是为了证实这个想法,我使用了sys.getsizeof(int())。

    △.注:sys.getsizeof(int()) 为这个类的总大小

    >>> sys.getsizeof(0)24>>> sys.getsizeof(1)28>>> sys.getsizeof(2 ** 30 - 1)28>>> sys.getsizeof(2 ** 30)32>>> sys.getsizeof(2 ** 60 - 1)32>>> sys.getsizeof(2 ** 60)36

    可以看到的是,随着存储的数字大小不同,int占有的空间也是不同的,越大的数,需要的存储空间越大。这种能够变得更长的表现暗示着它像列表之类的数据类型。事实上,在C语言中python的int是这样定义的:

    typedef struct {

    PyObject_HEAD

    long ob_ival;   #类型为长整型

    } PyIntObject;

    为了避免每次需要一个新的整数对象时都要申请新的对象,python提前为未使用的整数对象分配了一块空的区间。struct _intblock {    struct _intblock *next;

    PyIntObject objects[N_INTOBJECTS];

    };

    typedef struct _intblock PyIntBlock;

    ▲.0是没有价值的,所以不在存储值内,所以getsizeof(0)==24.

    通常在32、64位中的int都是4字节的,然而得到的结果明显远大于这个值,原因是在python中int已经很完善了,实现多种功能的同时,就意味着它需要占用更多的空间,消耗更多的内存。

    总的来说,这些都是跟硬件有关的,在32位和64位中不同数据类型所占的空间还是不同的。

    继续讨论下那块已经提前分配好的整数空间

    print(id(-6))  #3221839702960

    print(id(-5))  #1624465440

    print(id(255)) #1624473760

    print(id(256)) #1624473792

    print(id(257)) #2143657436272

    print(id(258)) #2143657438960

    可以看到-6到-5和256到257,地址突然跃变了,这其实是因为重新为[-5,256]之外的数分配了新的内存空间。

    #define NSMALLPOSINTS           257#define NSMALLNEGINTS           5static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

    A specific structure is used to refer small integers and share them so access is fast. It is an array of 262 pointers to integer objects. Those integer objects are allocated during initialization in a block of integer objects we saw above. The small integers range is from -5 to 256. Many Python programs spend a lot of time using integers in that range so this is a smart decision.

    if integer value in range -5,256:    return the integer object pointed by the small integers array at the

    offset (value + 5).else:    if no free integer object available:

    allocate new block of integer objects    set value of the next free integer object in the current block    of integers.    return integer object

    为了让更小的数字被访问的更快,事先python已经为[-5,256]之间的整数分配好了内存。如果要使用这个范围里面的数直接访问即可,加上相应的偏移量就能得到正确的数值,(-5的偏移量为0,-4的偏移量则为1)。如果不在这个范围内,python将另外创建个新的block来存放PyIntObject。

    展开全文
  • 排序数组删除重复项排序数组删除重复项大致思路代码实现 排序数组删除重复项 力扣简单习题: 大致思路 留一个计数君,碰到不一样的,就将计数君+1,并在此索引处直接将第二个值填充即可。 代码实现 package ...

    排序数组删除重复项

    力扣简单习题:
    在这里插入图片描述

    大致思路

    留一个计数君,碰到不一样的,就将计数君+1,并在此索引处直接将第二个值填充即可。

    代码实现

    package com.immunize.leetcode.delete_same;
    
    /**
     * leetcode:根据输入的数组,删除相同的值,且要在位置不变的情况下删除,在原数组里的原位置上删除,超出的位置不计
     * 
     * 例:0,0,1,1,1,2,2,3,3,4 返回0 1 2 3 4,且长度变为5
     * 
     * 解答思路:留一个计数君,碰到不一样的,就将计数君+1,并在此索引处直接将第二个值填充即可。
     * 
     * @author Mr IMMUNIZE 2019.8.7
     *
     */
    public class DeleteSame {
    	// 原型拷贝过来
    	public int removeDuplicates(int[] nums) {
    		// 当nums数组为空时,则返回0
    		if (nums == null || nums.length == 0) {
    			return -1;
    		}
    		// 初始化计数君count
    		int count = 0;
    		// 遍历数组
    		for (int i = 0; i < nums.length; i++) {
    			// 如果当前值和数组第一个值不同,则计数君加一,在计数君索引处修改值为当前值即可
    			if (nums[i] != nums[count]) {
    				count++;
    				nums[count] = nums[i];
    			}
    		}
    		// 长度为返回值,也就是count+1
    		count++;
    		return count;
    	}
    
    }
    ----------------------------------------------------------------------------------------
    package com.immunize.leetcode.delete_same;
    
    /**
     * 测试
     * 
     * @author Mr IMMUNIZE
     *
     */
    public class DeleteSameTest {
    	public static void main(String[] args) {
    		DeleteSame ds = new DeleteSame();
    		int[] nums = { 0, 0, 1, 1, 1, 2, 2 };
    		System.out.println(ds.removeDuplicates(nums));
    	}
    }
    
    
    展开全文
  • 今天就给大家分享下,不重复统计的那些事~~​01单列数据不重复统计我们经常遇到的是对单列数据进行不重复统计,比较常用的就是【数据】-【删除重复项】,就像下面这样,最终去除重复后的人员名单有5个。只要选择需要...

    一天,同事问了一个问题,说有3列数据,就比如下面,他想统计下,班级在1班里面,然后不重复的人员有多少?​你知道怎么计算吗?

    39d6267690b879cf85fab9f0f8a00d3b.png

    今天就给大家分享下,不重复统计的那些事~~​

    01

    单列数据不重复统计

    我们经常遇到的是对单列数据进行不重复统计,比较常用的就是【数据】-【删除重复项】,就像下面这样,最终去除重复后的人员名单有5个。

    45644363652ea07888a153e08cf35464.gif

    只要选择需要统计的数据,点击菜单栏中的删除重复项,即统计出不重复的数据

    除了这个方法外,我们还可以使用SUMPRODUCT函数结合COUNTIF函数对数据进行不重复统计

    我们只需要在F2单元格,输入如下公式,然后点击确认,即统计完成

    =SUMPRODUCT(1/COUNTIF(A2:A14,A2:A14))
    7ba2d7e716bffc0a736c4c55272e6638.gif

    公式详解:

    1、公式内首先是Countif函数进行条件计数,会输出下面这样一组数据

    29a4fb0816f9e05582cc0a98d0da3665.png

    2、然后当我们再使用1/Countif,即得到这样一组数据

    9f7d807b46fd3463d8ae4f3749976708.png

    比如小明1,总共出现了4次,countif计数的结果即为4,

    当我们再使用1/Countif(A2:A14,"小明1"),就会得到4个0.25的数值

    3、最后在使用SUMPRODUCT函数计算即得到人员不重复的计算结果

    02

    多条件多列数据不重复统计

    上面我们介绍了单列的不重复计数,再给大家分享下,有多条件多列数据的不重复计算

    就是我们文章开头提到的问题,要如何实现呢?

    dfce607e2a077625a2e561f5e9139148.gif

    现在给大家介绍2种方法实现

    方法一、公式法(SUMPRODUCT函数)

    和单列数据统计类似,多条件我们也可以使用SUMPRODUCT函数来实现

    首先我们先增加一行辅助列,如E列,在E2输入公式:

    =IF(SUMPRODUCT(($A$2:A2=A2)*($C$2:C2="一班"))=1,1,0)
    6954b3462bce1aba98dd36637c71d27b.gif

    下拉填充,即把不重复的人员名单和一班的人员统计出来了

    公式详解:

    SUMPRODUCT(($A$2:A2=A2)*($C$2:C2="一班")是计算满足这两个条件的进行统计

    单独使用此公式计算可得到如下结果:

    a12923727e9b505d7725d98b80e690a5.png

    从上能看出,比如E7单元格,我们可以看到小黄2出现了2次,到E8单元格的时候小黄2出现了3次,就不满足IF函数的"=1"的条件了

    所以每个人员就实现了只进行1次统计,再在F列使用SUM函数汇总即OK

    方法一、数据透视表筛选

    除了上面的方法,我们还可以使用数据透视表进行分析

    选中数据区域,点击【插入】-【数据透视表】,然后我们把"人员名单"拖到【行】上,把"班级"拖到【筛选器】上,当我们想要统计哪个班级的时候,点击筛选器上的筛选即统计完成

    0c089720a97987289c45f7e3db6ef371.gif

    上面的几种方法你get了吗,如果还没学会,那赶紧去练习下吧~~

    1d711dd08d45331a78ba6de60747bf01.png

    如果觉得文章对你有帮助的话,希望大家帮忙点赞关注加分享哦~,谢谢

    38f54f1441949d6b32d41028e344f0d2.gif
    展开全文
  • 从排序数组中删除重复项 II 题目 数组中的元素最多允许重复两次 思路 采用 count 计数,如果 count >2 跳过;否者存储元素 代码 public class Solution { public int removeDuplicates_2(int[] ...

    从排序数组中删除重复项 II

    题目

    数组中的元素最多允许重复两次

    思路

    采用 count 计数,如果 count >2 跳过;否者存储元素

    代码

    public class Solution {
     public int removeDuplicates_2(int[] nums) {
    
            if (nums.length == 0)
                return 0;
    
            int idx =0;
            int count =0;
    
            for (int i=0;i<nums.length;i++){
                if (i>0 && nums[i] == nums[i-1]){
                    count++;
                    if (count>2){/**说明重复数超过2个*/
                        continue;//继续执行for循环,避免使用break
                    }
    
                }
                else {/**如果出现不同,将 count 赋值为1*/
                    count=1;
                }/** idx 为去重之后的数组索引*/
                nums[idx] = nums[i];
                idx++;
    
            }
    
    
            return idx;
        }
        }

    转载于:https://www.cnblogs.com/HuanChen1025/p/8999269.html

    展开全文
  • 删除有序数组中的重复项 II: 题解: 双指针,l表示当前真实填充位置, r表示目前探测位置 代码: class Solution { public: int removeDuplicates(vector<int>& nums) { //cur为目前l所在...
  • 删除排序数组中的重复项 分析: 对此这道题,我原本的思路是先将重复元素挑出来,全部移到数组尾,同时计数,然后缩短数组长度,对无重复元素的数组进行一次排序; 这种方式并不是不可行,但对于未知量很多的数组而...
  • } } 正确的栈思路应该对每一个字符进行计数。 class Solution { public String removeDuplicates(String s, int k) { Stack<P> st = new Stack(); for (char c : s.toCharArray()) { if (st.isEmpty() || c != st....
  •   原地删除排序数组的重复项,返回移除后的数组长度。要求空间复杂度 O(1)。(LeetCode链接) 方法:双指针法;   本题我认为和 LeetCode-27 移除元素思想类似,这里我们也是使用双针指针的方法,设置两个标志 ...
  • 分析题目,主要有两个要考虑的问题:“如何原地删除重复元素”,以及“如何计数”。我们知道,在对排序数组进行遍历时,指针所指的值只会“相等”或者“变大”。若相等,即发现重复元素;否则为非重复元素。 基于...
  • 80. 删除排序数组中的重复项 II - 力扣(LeetCode) 思路: 特殊情况: 数组的长度为0,直接输出0; 一般情况: j为慢指针,i为快指针,当数组当前元素不等于前一个元素/等于前一个元素a的次数为1(特殊之处:下一个...
  • 遍历数组,当s[i]==s[i-1]时,栈顶计数+1,当栈顶的值为k时,删除字符串中连续K个相同的元素,并弹出栈顶计数 代码如下: class Solution { public: string removeDuplicates(string s, int k) { //使用栈来...
  • 给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。...
  • 然后计数cnt+1,如果cnt>2,那么应该停留,因为已经有两个元素保存了 如果 nums[i] != cur,说明出现新字符,此时: 更新cur,和cnt,替换num[j] class Solution: def removeDuplicates(self, nums)
  • countcountcount 的最小计数始终为 1。 我们从索引 1 开始一次处理一个数组元素。 若iii指向的元素与jjj指向的元素相同,即 nums[i]==nums[j],则 count+1count+1count+1。 若 count>2count > 2count>2,则...
  • 题目:给你一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。 你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。 在...
  • 题目 代码 class Solution(): def removeDuplicates(self, nums): if not nums: return 0 # 如果nums里面没有数,直接返回0 ... # count计数用。有不同的数,count加一 for i in range(len(nums)):
  • 对当前的值进行计数,当超过2时,将后面的值依次替换前面的值 int removeDuplicates(std::vector&lt;int&gt;&amp; nums) { if(nums.size()==0) return 0; int n=nums.size(); int i=1; int a=1; ...
  • 比较简单,用count计数不相同数组元素个数,如有不同元素改变数组(跟官方解法相同了) class Solution { public int removeDuplicates(int[] nums) { int count=0; for(int i=0;i<nums.length;i++){ if...
  • 题目: 分析: 对于这道题,我们要做的...每个数都存入map中,map自行计数 如果出现第三个数就将后面的数前移 代码: class Solution { public int removeDuplicates(int[] nums) { int n=nums.length; ...
  • 修改数组的话因为题目不让使用额外的数组空间,所以也变得有一点点难度,所以这里我们就可以去每找到一个不同的元素时,用计数的值减一就是此时应该被取代的位置。 代码 class Solution { public int remove...
  • 思路:用栈模拟即可,加一个计数的提高效率。 class Solution { public: string removeDuplicates(string s, int k) { string ans; if(k==1) return ans; using pr=pair&
  • 80. 删除排序数组中的重复项 II1. 题目描述2. 计数(Count)2.1 解题思路2.2 实例代码3. 参考资料 1. 题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新...
  • 我的思路是先创建一个新的不定长度的数组,把原数组的第一个值存入新数组,从原数组第二个元素开始对数组进行遍历,当遇到相同元素时则不予理睬继续进入下一个循环,遇到不同的数则计数加一并且添加进新数组。...
  • 这个删除重复项就是其中之一,用起来还是挺方便的。先看演示:由这个图上可以看到,C列的内容一共有13个重复值,删掉这13个重复值以后,剩下的人名是29个。也就是说,这列里面涉及的人名是29人。有个小伙伴给...
  • MySQL计数+去重

    千次阅读 2019-04-17 14:07:26
    2 运行出错发现如果记录出现重复项则结果有误,因此要进行去重。我去重的方式为删除原表中的重复记录select distinct * from courses select class from (select class,count(class) as class_count from (...
  • 重复数据处理

    2021-01-02 13:49:35
    使用函数countif countif(range,criteria),对区域中满足单个指定条件但单元格进行计数。 range:要计数但单元格范围 ...如果想单纯的知道这列都有那些不重复都数据,可通过【数据】-【删除重复项】即可完成。 ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 182
精华内容 72
关键字:

删除重复项计数