单身狗1和单身狗2(C语言版)

目录

[1. 单身狗1](#1. 单身狗1)

[2. 单身狗2](#2. 单身狗2)


1. 单身狗1

题目:

一个数组中只有一个 数字是出现一次其他所有数字都出现了两次。

编写一个函数找出这一个只出现一次的数字。

例如:有数组的元素是:1,2,3,4,5,1,2,3,4,6。只有5和6只出现1次,要找出5和6。

第一种方法:暴力解题法(枚举法)

这种方法就不细致讲解了,代码就能说明方法了

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
//第一种方法:暴力解法
//枚举法:直接用计数器的方式,找到该数字
int find_single_dog1(int arr[], int sz) {
	int num = 0;//作为标记,记录每位元素出现的次数
	int* count = (int*)malloc(sz * sizeof(arr[0]));//记录每位元素出现的次数,然后存储起来
	for (int i = 0;i < sz;i++) {
		for (int j = 0;j < sz;j++) {
			if (arr[i] == arr[j])
				num++;
		}
		count[i] = num;
		num = 0;
	}
	for (int i = 0;i < sz;i++) {
		if (count[i] == 1)
			return arr[i];
	}
	return -1;
}

int main() {
	int a[] = { 1,2,3,4,5,1,2,3,4 };
	int n = find_single_dog1(a, 9);
	printf("%d", n);
    return 0;
}

第二种方法:用异或解题

cpp 复制代码
//第二种:用异或解题
int find_single_dog1(int arr[], int sz) {
	int n = 0;
	for (int i = 0;i < sz;i++) {
		n ^= arr[i];
	}
	return n;
}

int main() {
	int a[] = { 1,2,3,4,5,1,2,3,4 };
	int n = find_single_dog1(a, 9);
	printf("%d", n);
	return 0;
}

2. 单身狗2

**题目:**一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

例如:有数组的元素是:1,2,3,4,5,1,2,3,4,6。只有5和6只出现1次,要找出5和6。

第一种方法:暴力解题法(枚举法)

这种方法就不细致讲解了,代码就能说明方法了

cpp 复制代码
//第一种方法:暴力求解法
int* find_single_dog_first(int arr[], int sz) {
	int* find = (int*)malloc(sz * sizeof(arr[0]));//创建一个标识数组
	int* re = (int*)malloc(2 * sizeof(arr[0]));//创建一个返回数组
	int flag = -1;//自己也算一次,当只有自己,flag结果为0
	for (int i = 0;i < sz;i++) {
		for (int j = 0;j < sz;j++) {
			if (arr[i] == arr[j])
				flag++;
		}
		find[i] = flag;
		flag = -1;
	}
	int num = 0;//记录re的下标
	for (int i = 0;i < sz;i++) {
		if (find[i] == 0) {
			re[num] = arr[i];
			num++;
		}
	}
	return re;
}

int main() {
	int arr1[] = { 1,2,3,4,5,1,2,3,4,6};
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int* ret = find_single_dog_first(arr1, sz);
	for (int i = 0;i < 2;i++) {
		printf("%d ", ret[i]);
	}
	return 0;
}

第二种方法:用异或解题

cpp 复制代码
//第二种方法:用异或的思想解题
//因为该题要返回两个int型的数据,但是函数返回只能返回一个数
//所以传入指针ps1和指针ps2来让计算后的数据能传到主函数main
void find_single_dog2(int arr[], int sz, int* ps1, int* ps2) {
	int r = 0;
	//1. 全部异或在一起,找出哪个位置为一
	for (int i = 0;i < sz;i++) {
		r ^= arr[i];
	}
	//2. 计算出哪个位置的数字1,用&运算符
	int pos = 0;//记录哪个位置为1
	for (int i = 0;i < 32;i++) {//因为r是int类型,有32位
		if (((r >> i) & 1) == 1) {
			pos = i;
			break;
		}
	}
	//3. 分组找出两个单身狗,并返回值
	for (int i = 0;i < sz;i++) {
		if (((arr[i] >> pos) & 1) == 1) {
			(*ps1) ^= arr[i];
		}
		else {
			(*ps2) ^= arr[i];
		}
	}
}

int main() {
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ps1 = 0;
	int ps2 = 0;
	find_single_dog2(arr, sz, &ps1, &ps2);
	printf("两个单身狗分别为:%d 和 %d", ps1, ps2);
	return 0;
}
相关推荐
2401_873479401 天前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope1 天前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python1 天前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
浪浪小洋1 天前
c++ qt课设定制
开发语言·c++
charlie1145141911 天前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler011 天前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你911 天前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
程序猿编码1 天前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
aq55356001 天前
编程语言三巨头:汇编、C++与PHP大比拼
java·开发语言
aq55356001 天前
PHP vs Python:30秒看懂核心区别
开发语言·python·php