常见算法题

Golang

// 求2个很大数之和
func maxNumSum(a string, b string) string {
	size := 0
	alen := len(a)
	blen := len(b)
	if alen > blen {
		size = alen
	} else {
		size = blen
	}

	result := ""
	for i := 0; i < size; i++ {
		// 如果下标越界了,就设置为0
		num1 := 0
		if i < alen {
			// a[i]类型为byte(ascii码),和整型运算会报错,转换成对应整型就-48
			num1 = int(a[i]) - 48
		}

		num2 := 0
		if i < blen {
			num2 = int(b[i]) - 48
		}

		// 字符和整型相加会报错,string(num1+num2)会变成空字符,用Sprintf或strconv.Itoa
		result += fmt.Sprintf("%d", (num1 + num2))
	}

	return result
}
// 字符串中第一个不重复的字符
func strFristNotDup(str string) string {
	m := make(map[rune]int)
	keys := make([]rune, 0)

	for _, s := range str {
		if _, ok := m[s]; !ok {
			keys = append(keys, s)
		}

		m[s] += 1
	}

	// map遍历是无序的,因此使用切片,当然也可以再遍历下字符str
	for _, s := range keys {
		if m[s] == 1 {
			return string(s)
		}
	}

	return ""
}

Nodejs

// 求2个很大数之和
function maxNumSum(a, b) {
	const alen = a.length;
	const blen = b.length;
	const len = alen > blen ? alen : blen;

	let result = "";
	for (let i=0; i<len; i++) {
		// a[i]为对应字符,转换成整型才能相加,不然变成字符累加
		const num1 = i < alen ? parseInt(a[i], 10) : 0;
		const num2 = i < blen ? parseInt(b[i], 10) : 0;
		// 字符和整型可以相加,自动转换成字符
        result += (num1 + num2)
    }

    return result;
}
// 字符串中第1个不重复字符
function strFristNotDup(str) {
	const m = {};

	for (let i = 0; i < str.length; i++) {
		if (!m[str[i]] && str.indexOf(str[i], i + 1) === -1) {
			return str[i];
		}

		m[str[i]] = true;
	}
}

Python

# 求2个很大数之和
def maxNumSum(a, b):
	alen = len(a)
	blen = len(b)
	size = alen if alen > blen else blen

	result = ""
	for i in range(size):
		# a[i]为对应字符,转换成整型才能相加,不然变成字符累加
		num1 = int(a[i]) if i < alen else 0
		num2 = int(b[i]) if i < blen else 0
		# 字符不能和整型直接累加,需要str转换成字符
		result += str(num1 + num2)

	return result
# 字符串中第1个不重复的字符 
# 方法1:
def strFirstNotDup(str):
    m = Counter(str)
    # []返回的是数组,()返回的是迭代器需要使用next从中取1个
    return next((k for k, v in m.items() if v == 1), '')

# 方法2:
def strFirstNotDup(str):
	m = {}
    for s in str:
        m[s] = m.get(s, 0) + 1
    return next((s for s in str if m[s] == 1), '')

C#

// 求2个很大数之和
public static string maxNumSum(string a, string b) {
	int alen = a.Length;
	int blen = b.Length;
	int len = alen > blen ? alen : blen;

	string result = "";
	for (int i=0; i<len; i++) {
		// Console.WriteLine(a[i].GetType());
		// a[i]为char类型(ascii码),转换成对应整型-48,char可以直接和整型运算
		int num1 = i < alen ? a[i] - 48 : 0;
		int num2 = i < blen ? b[i] - 48 : 0;
		// 字符和整型可以相加,自动转换成字符
		result += (num1 + num2);
	}
	return result;
}
// 字符串中第1个不重复的字符 
// 方法1:
public static char strFirstNotDup(string str) {
	foreach (char s in str) {
		if (str.IndexOf(s) == str.LastIndexOf(s)) {
			return s;
		}
	}
				
	return ' ';
}
// 方法2:
public static char strFirstNotDup(string str) {
	Dictionary<char, int> m = new Dictionary<char, int>();
	
	foreach (char s in str) {
		// 不能直接m[s]++
		m[s] = m.ContainsKey(s) ? m[s] + 1 : 1;
	}
	
	foreach (var o in m) {
		 if (o.Value == 1) {
			return o.Key;
		 }
	}
	
	// 中间必须包含空格,否则是无效字符
	return ' ';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值