字符串查找(重复次数)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串查找(重复次数)相关的知识,希望对你有一定的参考价值。

参考技术A 首先用户输入一个字符串,然后再次输入一个字符串,然后输出第二个字符串在第一个字符串中出现的次数。

1.分配内存
2.从终端接收字符串
3.比较长度
4.比较
5.输出

如果第二次输入的字符串比第一次输入的长,那么没有必要进行比较,所以首先进行长度比较

如果字符串一比字符串二长,那么就进行比较

1.存储的数据需要延长生命周期
2.一个指针变量需要存储数据,变量本身只能存地址,不能存数据,需要分配内存空间来存储数据

1.不需要预先分配储存空间
2.分配的空间可以根据程序的需要扩大或缩小。

头文件为<stdlib.h>
1.定义指针p,

2.分配数组空间,用来存储数组元素,空间大小按元素个数计算;

3.按一维数组方式使用这个数组

若是一维数组,则元素为p[i];若是二维数组,则元素为p[i*M+j],其中M为列元素个数

4.释放数组空间

例如:

对于动态分配内存,可以举如下例子

输入人名,并为其分配内存。

是否继续

输入人名 将地址放到pHead对应位置

输入人名

主函数

可以观察到,运用函数实现功能,使得主函数非常简洁。

在使用完内存空间之后,一定要手动释放内存!

如果可以,大家连上自己的热点再写吧,因为这个校园网可能不知道什么时候就悄悄咪咪的就给你断掉了!即使断掉了,也不要像我一样去点刷新!

如何在数组中查找重复项并显示它们出现的次数?

【中文标题】如何在数组中查找重复项并显示它们出现的次数?【英文标题】:How do I find duplicates in an array and display how many times they occurred? 【发布时间】:2014-01-12 23:21:52 【问题描述】:

我正在编写一个代码,该代码从数组中打印出重复的整数及其出现次数。我不允许使用 LINQ,只是一个简单的代码。我想我很接近但对如何获得正确的输出感到困惑:

class Program

    static void Main(string[] args)
                  
        int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
        int count = 1;
        for (int i = 0; i < array.Length; i++)
        
            for (int j = i; j < array.Length - 1 ; j++)
            

               if(array[j] == array[j+1])
                  count = count + 1;
            
            Console.WriteLine("\t\n " + array[i] + "occurse" + count);
            Console.ReadKey();
        
    

【问题讨论】:

【参考方案1】:

由于您不能使用 LINQ,因此您可以使用集合和循环来代替:

static void Main(string[] args)
              
    int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
    var dict = new Dictionary<int, int>();
    
    foreach(var value in array)
    
        // When the key is not found, "count" will be initialized to 0
        dict.TryGetValue(value, out int count);
        dict[value] = count + 1;
    
    
    foreach(var pair in dict)
        Console.WriteLine("Value 0 occurred 1 times.", pair.Key, pair.Value);
    Console.ReadKey();

【讨论】:

我通常不会在帖子中编辑代码,但我认为TryGetValue() 模式更具可读性,也更高效(对于阅读,只需一个键查找存在的值而不是两个值),我已经继续进行了编辑,而不是仅仅提出它。如果您真的讨厌它,请随时恢复。【参考方案2】:

使用Group by:

int[] values = new []1,2,3,4,5,4,4,3;

var groups = values.GroupBy(v => v);
foreach(var group in groups)
    Console.WriteLine("Value 0 has 1 items", group.Key, group.Count());

【讨论】:

【参考方案3】:

让我们看一个更简单的例子。假设我们有数组0, 0, 0, 0

你的代码会做什么?

它将首先查看第一项之后有多少项等于它。第一项之后有三项与之相等。

然后它转到下一个项目,并在它之后查找与其相等的所有项目。那里有两个。到目前为止,我们已经达到了 5 个,甚至还没有完成(我们还有一个要添加),但是整个数组中只有四个项目。

显然我们这里有一个问题。我们需要确保当我们在数组中搜索给定项目的重复项时,我们不会再次通过它搜索相同的项目。虽然有很多方法可以做到这一点,但这种基本方法看起来需要做很多工作。

当然,我们可以采取完全不同的方法。我们可以遍历数组once,而不是遍历每个项目并搜索其他类似的项目,并添加我们找到该字符的次数。使用Dictionary 让这一切变得简单:

var dictionary = new Dictionary<int, int>();

foreach (int n in array)

    if (!dictionary.ContainsKey(n))
        dictionary[n] = 0;
    dictionary[n]++;

现在我们可以遍历字典并查看多次找到哪些值:

foreach(var pair in dictionary)
    if(pair.Value > 1)
        Console.WriteLine(pair.Key);

这使代码清晰易读,明显正确,并且(作为奖励)比您的代码高效得多,因为您可以避免多次循环遍历集合。

【讨论】:

【参考方案4】:

这是一个避免使用字典的答案。由于 OP 说他不熟悉它们,这可能会让他对字典的作用有所了解。

这个答案的缺点是您必须对数组中的最大数实施限制,并且不能有负数。您永远不会在实际代码中实际使用此版本。

int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
int[] count = new int[13];

foreach(int number in array) 
    // using the index of count same way you'd use a key in a dictionary
    count[number]++;


foreach(int c in count) 
    int numberCount = count[c];
    if(numberCount > 0) 
        Console.WriteLine(c + " occurs " + numberCount + " times");
    

【讨论】:

【参考方案5】:

好的,我已经修改了您的代码。这应该可以完成工作:

class Program

    static void Main(string[] args)
    
        int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;

        for (int i = 0; i < array.Length; i++)
        
            int count = 0;
            for (int j = 0; j < array.Length; j++)
            

                if (array[i] == array[j])
                    count = count + 1;
            
            Console.WriteLine("\t\n " + array[i] + " occurs " + count + " times");
        
        Console.ReadKey();
    

【讨论】:

它会报告“10 发生 2 次”两次。 没错,除了打印出一些值和它们的出现不止一次之外,它有点工作。 是的,这就是本例中发生的情况。要摆脱它,您需要使用另一个数组变量或字典,如其他示例所示。但除了您在示例中已经使用过的变量之外,我没有使用任何其他变量。 我会再看一遍,但谢谢你把它推到这里:)【参考方案6】:
int[] arr =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
var result = arr.GroupBy(x => x).Select(x => new  key = x.Key, val = x.Count() );       
foreach (var item in result)

    if(item.val > 1)
                    
        Console.WriteLine("Duplicate value : 0", item.key);
        Console.WriteLine("MaxCount : 0", item.val);
    



Console.ReadLine();

【讨论】:

【参考方案7】:

/这是帮助您使用 Forloop 查找重复整数值的答案,它只会返回重复值而不是其出现时间/

    public static void Main(string[] args)
    
        //Array list to store all the duplicate values
        int[] ary =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
        ArrayList dup = new ArrayList();

        for (int i = 0; i < ary.Length; i++)
        
            for (int j = i + 1; j < ary.Length; j++)
            
                if (ary[i].Equals(ary[j]))
                
                    if (!dup.Contains(ary[i]))
                    
                        dup.Add(ary[i]);
                    
                
            
        
        Console.WriteLine("The numbers which duplicates are");
        DisplayArray(dup);
    
    public static void DisplayArray(ArrayList ary)
    
        //loop through all the elements
        for (int i = 0; i < ary.Count; i++)
        
            Console.Write(ary[i] + " ");
        
        Console.WriteLine();
        Console.ReadKey();
    

【讨论】:

【参考方案8】:
public static void FindRepeating(int[] input) 

    for (var i = 0; i < input.Length; i++)
    
        var abs = Math.Abs(input[i]);

        if (input[abs] >= 0)
            input[abs] = -input[abs];
        else
            Console.Write(abs + " ");
    
  

【讨论】:

【参考方案9】:

你犯了一个小错误,使用 J 而不是 i ...

class Program

    static void Main(string[] args)
                  
        int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
        int count = 1;
        for (int i = 0; i < array.Length; i++)
        
            for (int j = i; j < array.Length - 1 ; j++)
            
               if(array[i] == array[j+1])
                  count = count + 1;
            
            Console.WriteLine("\t\n " + array[i] + "occurse" + count);
            Console.ReadKey();
        
    

【讨论】:

【参考方案10】:
int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 7, 7, 8, 9, 7, 12, 12 ;
Dictionary<int, int> duplicateNumbers = new Dictionary<int, int>();
int count=1;
for (int i = 0; i < array.Length; i++)

    count=1;
    if(!duplicateNumbers.ContainsKey(array[i]))
    
        for (int j = i; j < array.Length-1; j++)
        
            if (array[i] == array[j+1])
            
                count++;                            
            
        
        if (count > 1)
        
            duplicateNumbers.Add(array[i], count);
        
    

foreach (var num in duplicateNumbers)

    Console.WriteLine("Duplicate numbers, NUMBER-0, OCCURRENCE- 1",num.Key,num.Value);

【讨论】:

如果要使用字典,不妨正确使用,避免问题作者在原文中的 O(n^2) 成本代码。【参考方案11】:
using System;
using System.Collections.Generic;

namespace ConsoleApp1

    /// <summary>
    /// How do you find the duplicate number on a given integer array?
    /// </summary>
    class Program
    
        static void Main(string[] args)
        
            int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;

            Dictionary<int, int> duplicates = FindDuplicate(array);

            Display(duplicates);

            Console.ReadLine();
        

        private static Dictionary<T, int> FindDuplicate<T>(IEnumerable<T> source)
        
            HashSet<T> set = new HashSet<T>();
            Dictionary<T, int> duplicates = new Dictionary<T, int>();

            foreach (var item in source)
            
                if (!set.Add(item))
                
                    if (duplicates.ContainsKey(item))
                    
                        duplicates[item]++;
                    
                    else
                    
                        duplicates.Add(item, 2);
                    
                
            

            return duplicates;
        

        private static void Display(Dictionary<int, int> duplicates)
        
            foreach (var item in duplicates)
            
                Console.WriteLine($"item.Key:item.Value");
            
        
    

【讨论】:

【参考方案12】:

这种方法经过修正,将提供正确的输出(它的效率非常低,但除非您大幅扩大规模,否则这不是问题。)

int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
for (int i = 0; i < array.Length; i++)

    int count = 0;
    for (int j = 0; j < array.Length ; j++)
    
       if(array[i] == array[j])
          count = count + 1;
    
    Console.WriteLine("\t\n " + array[i] + " occurs " + count);
    Console.ReadKey();

我在 OP 代码中计算了 5 个错误,如下所示。

int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
int count = 1;                                   // 1. have to put "count" in the inner loop so it gets reset
                                                 // 2. have to start count at 0
for (int i = 0; i < array.Length; i++)

    for (int j = i; j < array.Length - 1 ; j++)  // 3. have to cover the entire loop
                                                 // for (int j=0 ; j<array.Length ; j++)
    
       if(array[j] == array[j+1])                // 4. compare outer to inner loop values
                                                 // if (array[i] == array[j])
          count = count + 1;
    
    Console.WriteLine("\t\n " + array[i] + "occurse" + count);
                                                 // 5. It's spelled "occurs" :)
    Console.ReadKey();

编辑

要获得更好的方法,请使用Dictionary 来跟踪计数。这允许您只循环一次数组,并且不会将重复的计数打印到控制台。

var counts = new Dictionary<int, int>();
int[] array =  10, 5, 10, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12 ;
for (int i = 0; i < array.Length; i++)

    int currentVal = array[i];
    if (counts.ContainsKey(currentVal))
        counts[currentVal]++;
    else
        counts[currentVal] = 1;

foreach (var kvp in counts)
    Console.WriteLine("\t\n " + kvp.Key + " occurs " + kvp.Value);

【讨论】:

【参考方案13】:
 class Program

    static void Main(string[] args)
    
        int[] arr =  2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12 ;
        List<int> nums = new List<int>();
        List<int> count = new List<int>();
        nums.Add(arr[0]);
        count.Add(1);
        for (int i = 1; i < arr.Length; i++)
        

            if(nums.Contains(arr[i]))
            
                count[nums.IndexOf(arr[i])] += 1;
            
            else
            
                nums.Add(arr[i]);
                count.Add(1);
            
        

        for(int x =0; x<nums.Count;x++)
        
            Console.WriteLine("number:"+nums[x] +"Count :"+ count[x]);
        
        Console.Read();
    

【讨论】:

以上是关于字符串查找(重复次数)的主要内容,如果未能解决你的问题,请参考以下文章

用对象存储的方法实现查找字符串或者数组中重复次数最多的元素!!!!!

查找一个单词在字符串中出现的次数的几种方法

查找并计算字符串中提到的单词(python 3)[重复]

js查找字符串中重复最多的字母

C语言,查找数组里重复出现的数字;

华为python机试题目:整数与IP地址间的转换图片整理字串的连接最长路径查找提取不重复的整数字符串合并处理字符串最后一个单词的长度删除字符串中出现次数最少的字符